
C++
紫火桑葚
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
接入阿里kafka无法查到符号
error LNK2019: 无法解析的外部符号 "__declspec(dllimport) class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl RdKafka::err2str(enum RdKafka::ErrorCode)" (__imp_?err2str@RdKafka@@YA?AV?$basic_string@DU?$ch原创 2022-03-08 17:14:30 · 1922 阅读 · 0 评论 -
C++ 别要求子类重写虚函数时调用基类同名函数
别要求子类重写虚函数时调用基类同名函数原创 2021-12-31 14:27:13 · 767 阅读 · 2 评论 -
C++ std::map for 循环效率
写法1:常规迭代遍历for (auto it = m_mapUser.begin(); it != m_mapUser.end(); ++it){ //todo}//评价:很常用的写法,效率也很高写法2:auto遍历for (auto it : m_mapUser){ //todo}//评价:写法简单,效率低,map数据量很小的时候适用,数据量大坚决不能这么写//测试数据10w条记录,遍历一次需要24s,100w条需要270s写法3:auto遍历(改进)for (au原创 2021-12-07 11:08:08 · 3661 阅读 · 4 评论 -
C++ 获取自定义模板的对象名称
不解释,看实例正常使用宏定义时,要获取符号名称,是使用#把名称字符串化,但这种方式在模板中不好使,需要更底层提供的运算符操作typeid。template<typename T>class CTest {public: CTest() { sName = typeid(T).name(); } std::string GetName() { return sName; }private: std::string sName;};int main() { C原创 2021-10-30 23:09:47 · 1114 阅读 · 0 评论 -
遍历查找最大最小值
题目很简单,只要会一些变成功底的,都能写出来,比如以下代码//简单示例,不追求绝对的可用//示例1void Find(std::vector<int> aData, int& minValue,int& maxValue){ if(aData.empty()) return; minValue=aData[0]; maxValue=aData[0]; for(size_t i = 0; i<aData.size();++i) { if(minVal原创 2021-10-13 10:14:46 · 312 阅读 · 0 评论 -
大小端问题
本来我想说,Windows平台一般是小端,Linux一般是大端;但是,实际上大小端CPU架构有关,当然和系统也可能有关,可以配置大小端;对于CPU框架,ARM是小端,目前移动端CPU也是小端,stm32这类的嵌入式CPU一般是大端;我看网上的有些文章是这么描述的:大端:高位存在低地址,低位存在高地址;小端:高位存在高地址,低位存在低地址;刚开始看的时候,还挺认可的,然而仔细...原创 2019-08-22 15:49:15 · 1259 阅读 · 0 评论 -
简易分析UTF8和UNICODE转换关系(std::string如何存储汉字)
首先要强调,耐心看完!第一:必须知道的是,每个数字 字母 符号 中文 火星文 特殊符号,都有对应的编号,比如在ASCII表中可以找到,字母'A'的编号是65,'%'的编号是37,当然ASCII表中只能找到编号在255以内所对应的数字 字母 符号;而每个中文汉字的编号大多是几千~几万的值;第二:普及下,所谓的UTF8 UTF16 UTF32,就是在计算机内存中,每个字符最小占用多少个字节...原创 2020-06-08 14:32:01 · 1146 阅读 · 0 评论 -
C++ 之 # 与 ##
先看实例(示例不追求编译合法性,只表达某些用法含义)class CTest{}void main(){ std::string s1 = #CTest; // s1="CTest" my##CTest; // 结果是myCTest}很明显,#是把符号转变成字符串;##是连接常用于宏定义结合以下例子,应该很容易理解:#define DEFAULT_FUNC(__Cls) std::string GetClassName(){ return #__Cls; }#define DEF原创 2021-08-26 11:07:43 · 196 阅读 · 0 评论 -
IOCP IPV6 支持
重点是 sockaddr_storage 结构;地址结构调整:sockaddr_storage m_sockaddr;可以对照调用接口名称,对应修改:1.AcceptExif (!AcceptEx(m_pListenSocket->GetSocket(), m_sSocket, m_szBuffRecv, 0, sizeof(sockaddr_storage), sizeof(sockaddr_storage), &dwRecv, &m_olRecv)) //if (!Ac原创 2021-08-12 11:17:37 · 295 阅读 · 0 评论 -
原生字符串字面量
提前解释内容:u8前缀:utf8存储格式;比如:u8"abc"字符串u前缀:utf16存储格式;比如:u"abc"字符串U前缀:utf32存储格式;比如:U"abc"字符串原生字符串字面量 关键字:R//举例,比较典型的,符合大众认知的转义符 \n 换行cout << R"(abc\nabc)";// 输出内容是 abc\nabcprintf(R"(abc\n111)");// 输出内容是abc\n111//输出结果是//abc\n//123cout<<R"(原创 2021-07-14 17:43:05 · 201 阅读 · 0 评论 -
C++11之 自定义字节对齐方式(扩展字节对齐方式)
操作符:alignof(XXXX) 输出对齐方式描述符:alignas(xxxx) 自定义对齐方式(xxxx必须是2的幂,即1,2,4,8,16,32,…,2^n)1,2,4,8 通常称为基本对齐值,或标准对齐16,32,64,… 这类大于8的对齐方式,称为扩展对齐值自定义对齐方式也是受到平台限制的,并非可以随心所欲的定义任何值如果定义的扩展对齐值超过平台最大限制值,则可能出现编译期错误,甚至运行时未知内存异常传统的对齐方式传统C++对齐方式,都是默认的1字节,2字节,4字节,8字节对齐C+原创 2021-07-13 17:50:57 · 928 阅读 · 0 评论 -
编译器生成类默认构造和禁用默认构造
直接看实例,关键字 default 和 deleteclass A{public: A() = default;// 告诉编译器,即便有自定义构造,也要生成默认构造 A(int n){} //自定义构造 A(const A&) = delete;// 禁用拷贝构造protected:private:};...原创 2021-07-08 17:21:05 · 317 阅读 · 0 评论 -
线程独立局部存储
所谓线程独立局部存储,说白了,就是不同线程之间的变量独占内存空间,不共享,即便是全局变量关键字 thread_local,不必纠结怎么实现的,会用就行#include <windows.h>#include <cstdio>#include <iostream>#include <thread>#include <atomic>using namespace std;int thread_local g_nCount = 0原创 2021-07-07 17:17:54 · 361 阅读 · 0 评论 -
C++11 thread
包含头文件#include < thread >用法很简单,直接看例子:#include <thread>void func0(int nArg1,int nArg2) { cout << nArg1 << nArg2 << endl;}void func1() { // to do}int main() { thread t0(func0, 1, 2);//创建线程 thread t1(func1);//创建线程原创 2021-07-02 16:22:35 · 105 阅读 · 0 评论 -
变长模板实现完美转发
#include <cstdio>#include <iostream>using namespace std;struct A { A() {} A(const A& a) { cout << "COPY Constructed " << __FUNCTION__ << endl; } A(A&& a) { cout << "Move Constructed " << __FUNCT原创 2021-06-23 17:20:07 · 154 阅读 · 0 评论 -
以模板作为模板参数(嵌套模板)
#include <cstdio>#include <tuple>using namespace std;template<typename A,typename B> struct S{};template< template<typename...>typename T,typename... TArgs //这边很难理解,需要看tuple原型,辅助理解 ,template<typename...>typename U原创 2021-06-23 16:45:33 · 419 阅读 · 0 评论 -
sizeof...
先看例子template<class... T> int Test(T ...t){ size_t nSize = sizeof...(t); switch(nSize){ //to do }}没错,新特性中又扩展了 运算符 【sizeof…】,用于计算变长包的长度,上面例子中,如果 Test(11,22,33,44,55,66),则sizeof…(t)=6...原创 2021-06-23 14:53:20 · 683 阅读 · 0 评论 -
变长模板:模板参数包和函数参数包
#include <iostream>using namespace std;template <long... nums> struct Multiply;template<long first, long... last>struct Multiply<first, last...> { static const long val = first * Multiply<last...>::val;};template<原创 2021-06-17 18:49:57 · 111 阅读 · 0 评论 -
C++编译器使用函数接口给常量赋值(常量表达式函数)
关键字:constexpr传统C++有很大的限制,一般编译期,只能通过 宏定义、枚举、常量 来定义某些特定值,而新标准中,可以用关键字constexpr来通过常量表达式函数,给常量赋值;先认识下,什么是常量表达式函数 和 非常量表达式函数:constexpr int func() { return 1; }//常量表达式函数const int func() { return 1; } //非常量表达式函数,即便使用了const,让人感觉像常量表达式int func({ return 1; }//非原创 2021-06-08 10:18:01 · 770 阅读 · 0 评论 -
通讯消息混淆表生成小工具
不废话,直接上代码// 生成混淆表工具void main(){ std::vector<BYTE> vEncode(256);// 编码表 std::vector<BYTE> vDecode(256);//解码表 for (int i = 0; i < 256; ++i) { vEncode[i] = i; } std::random_shuffle(vEncode.begin(), vEncode.end()); for (int i = 0; i原创 2021-05-24 16:36:30 · 139 阅读 · 0 评论 -
强类型枚举
传统枚举枚举,默认值类型为基础类型enum{ RED, GREEN, BLUE,}sizeof(RED) = 4 //数值占用内存4字节enum{ GAME, GATE, HALL, CENTER = 0xFFFFffffFFLL,}sizeof(GAME) = 8sizeof(CENTER) = 8 //数值占用内存8字节enum COLOR{ RED, GREEN, BLUE,}传统枚举会存在隐式类型转换问题,因此,新标准增加强类型枚举://关键在于原创 2021-04-25 17:37:21 · 473 阅读 · 0 评论 -
申请内存new(placement new)
char aBuf[32]{0};char* p = new(aBuf) char[8];// p与aBuf地址相同,这种方式在内存池中使用较多,一般会重写operator new()char* p = new(aBuf) char[8] {"abc"};//同时初始化内容 p="abc",aBuf[32]="abc"//new同时初始化int* i = new int(1)float* f = new float(1.5f)...原创 2021-04-25 17:37:32 · 131 阅读 · 0 评论 -
类继承 之 变量地址问题
//空基类A1,A2class A1{}class A2{}//派生类B1,B2//继承空基类A1,首个非静态成员变量A1class B1:public A1{ private: A1 a1;}//继承空基类A1,首个非静态成员变量A2class B2:public A1{ private: A2 a2;}void main(){ B1 b1;//可验证得到:&b1 != &b1.a1 [一般情况下:&b1 + 1 == &b1原创 2021-04-23 14:37:44 · 127 阅读 · 0 评论 -
空类的大小
空类的大小//空类class A{};sizeof(A) //空类虽然没有任何成员变量,但依然会占用最小默认空间,得到的结果是 1 字节;原创 2021-04-23 14:35:20 · 106 阅读 · 0 评论 -
判断是否左值引用/右值引用
判断是否左值引用/右值引用有时候搞不清楚推导出来的类型是左值引用还是右值引用,可以用接口辅助判断:int i = 0;std::is_lvalue_reference<decltype(++i)>::value;//判断是否左值引用std::is_rvalue_reference<decltype(++i)>::value;//判断是否右值引用...原创 2021-04-23 14:34:08 · 368 阅读 · 0 评论 -
推导返回值类型 result_of
用于推导函数返回值类型,以下演示函数和回调函数的类型推导过程:typedef int (*func)(int);void main(){ result_of<func(int)>::type i;//i就是int类型 i = 100; i = 200;}int func(int) { return 0; }void main(){ std::result_of<decltype(func)&(int)>::type i;}...原创 2021-04-23 14:33:13 · 292 阅读 · 0 评论 -
类型推导decltype
字面意思:类型推导,用途与auto有几分相似;常常与using或typedef配合使用;看例子,帮助理解:void main(){ std::vector<int> vData; typedef decltype(vData.begin()) VECITOR;//推导出迭代器类型 std::vector<int>::iterator for(decltype(vData)::iterator it = vData.begin(); it != vData.end();原创 2021-04-23 14:31:50 · 110 阅读 · 0 评论 -
C++用户自定义字面量 operator““
这个就比较有意思了,在常规的C++编程中,很少用到,算是比较新鲜,其实就是类似于重写运算符,以下例子只是表://只是举例,不追求合理性和效率性std::vector<std::string> operator""_C(const _In_ char* pData, IN size_t nSize) { std::vector<std::string> vResult; //假设对字符串进行切割 //比如"a1;b1;c1;d1"根据‘;’切割成 a1 b1 c1 d原创 2021-04-23 14:30:59 · 435 阅读 · 0 评论 -
auto 关键字
auto a{1};// a intauto a = 1;//a intauto b = 1.1;//b doubleauto c = new char;//c char*auto d = new auto(1);//d int*auto e = d;//e int*auto* f = d;//f int*auto& g = d;//g int*&auto h = 1,i = 2,j = 3;// h i j => int/*********** auto 看似负荷原创 2021-04-23 14:29:28 · 164 阅读 · 1 评论 -
继承同名函数
关键词using:class Base{ void func(int i){}}class A:public Base{ void func(double d){} //继承Base类,但本身存在func函数,会造成同名函数重载覆盖,但又希望两个函数同时存在: using Base::func;//声明要并存Base::func函数}...原创 2021-04-23 14:28:39 · 231 阅读 · 0 评论 -
继承构造
类发生继承关系时,需要初始化基类,常常造成比较繁琐的写法class Base{ Base(int i){ iAge = i; }private: int iAge;}class A:public Base{ A(int i):Base(i){}//只是为了传递参数到基类中初始化}以上例子看着挺简单的,好像谈不上繁琐写法,但如果Base有多种形式的构造函数呢,此时派生类A很可能需要再重写一遍基类种的所有构造函数,但仅仅是为了透传参数给基类进行初始化,程序员大多比较懒,能坐着绝不站着原创 2021-04-23 14:27:10 · 231 阅读 · 1 评论 -
解析 int (*(*pf( )) ( ) ) ( ) 含义及其如何分解成简单的追踪返回类型表达式
也是从网上的博文学习的分析复杂声明的准则:1.声明中出现的操作符的优先级;2.由内而外逐步分析,确定声明中标识符与操作符结合起来,所代表的含义;重点:当指针解引用符 * 与一个表示函数的标识符结合时,表示这个函数的返回值,是一个指针:例,*pf表示pf是一个返回值为指针的函数int (*(*pf( )) ( ) ) ( )pf():pf是一个无参函数;*pf():pf是一个无参函数,它的返回值是一个指针;(*pf())():pf是一个无参函数,它的返回值是一个无参函数的指针;*(*原创 2021-04-23 14:24:25 · 757 阅读 · 0 评论 -
泛型 之 追踪返回类型
模板编写时,经常需要自动推导参数类型,比较直观的例子,两个数值相加,并返回结果,按照我们的预期,可以编写以下代码:template<typename T1, typename T2>decltype(t1 + t2) Sum(T1& t1, T2& t2){ return t1 + t2;}然而编程语言的规则,往往不支持我们的预期行为, decltype(t1+t2) 中的t1和t2此时会被识别未定义类型;此时需要追踪返回值类型:template<typen原创 2021-04-22 17:03:21 · 129 阅读 · 0 评论 -
关于C++自主实现Http同步请求
首先,Http 本身也是基于 TCP 协议实现的代码实现先声明,下面代码是临时写的,没经过测试,只是为了表示http的实现过程,等需要的时候,再来详细调试测试;void HttpRequest(std::string strUrl, bool bPost, const char* pPostData, std::map<std::string, std::string>* pmapHeader = nullptr) { static std::pair<std::string,原创 2021-04-22 09:57:28 · 707 阅读 · 0 评论 -
C++11小笔记
想到哪记到哪,持续更新中左值引用常用于定义变量别名//T是某种数据类型T&//例T t;T& t1=t;//t1是t的别名,共用内存,且t1不可再成别其他变量的别名,t1必须在定义时就被初始化右值引用常在 移动构造函数 或 完美转发 中见到//T是某种类型T&&//例void Test(T&& t)折叠引用给类型定义新别名时,可能存在对引用类型的引用,有点绕,看例子typedef int INTtypedef INT&am原创 2021-04-15 10:34:54 · 135 阅读 · 0 评论 -
VS编译器调试小技巧(持续更新)
返回值寄存器在代码中,可能会有以下写法//定义接口int GetValue();//调用接口if(GetValue()){ //todo...}当执行完if(GetValue())代码时,有可能需要知道返回值是什么,此时可以在VS编译器的监视中添加EAX寄存器中查看返回值(返回值是int,可以直接用EAX查看低32位值,如果long long值,还需要查看EDX寄存器查看高32位值)...原创 2021-04-14 15:53:52 · 484 阅读 · 1 评论 -
__fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE)
__fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE)出错,堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出问题;__report_gsfailure查看调用堆栈,往前找,大概率是访问 某个局部变量的数组时,越界了!比如char p[128]="xxxxx";char aData[32];memcpy(aData,p,128);//越界,栈溢出...原创 2020-12-02 16:07:52 · 3529 阅读 · 0 评论 -
关于服务器在特定时间段,用户同时掉线,且掉线持续时间很有规律 & GetTickCount
先说下时间规律:49.71天;这是一个很魔性的时间,因为GetTickCount函数,返回值是DWORD类型,单位毫秒,也就是unsigned int,最大值UINT_MAX,也就是4294967295,可以自己换算下天数:UINT_MAX / 1000 / 24 / 3600 = 49.71再看下示例代码:DWORD g_dwLastTime = GetTickCount() //假设全局变量void OnTimer(){ DWORD dwCurTime = GetTic.原创 2020-09-30 13:52:38 · 413 阅读 · 0 评论 -
C++ 可能存在的内存泄漏问题(个人经验总结)
1.几乎所有程序员都知道的,使用new申请的内存,已不再使用却没被delete;破解之道:方法很多,最基础方法就是程序员自己注意 new 和 delete 配套出现;比较高级一点的,就是模仿智能指针,使用引用计数器;2.new出来的内存,被强转成其他类型,之后被释放,但内存并没有被清理干净;比如:(示例伪代码,不追求可运行)class Student{private: int a; int b;}class Person{}void main(){.原创 2020-06-19 17:33:00 · 546 阅读 · 0 评论 -
C++ 简单的CPU使用率监控程序
主要代码如下:// test4.cpp : 定义控制台应用程序的入口点。// 简单的监控指定程序列表的CPU使用率#include "stdafx.h"#include<thread>#include <windows.h>#include <stdint.h>#include <tlhelp32.h>#include <stdio.h>#include <iostream>#include <ve.原创 2020-05-25 18:01:40 · 1807 阅读 · 0 评论