c++总结(持续更新中)
1、c的class默认继承方式为privatestruct默认继承方式为public2、模板参数使用用途作为容器成员类型如STL作为继承体系中的基类作为继承体系中基类的模板参数作为类组件的依赖组件即依赖的接口方法作为区分不同子类型如boost.asio中的id与service_idType和service与service_baseType3、bind到成员函数时用std::bind(class::memberFun,...)4、WaitForMultipleObjects支持最大句柄数为MAXIMUM_WAIT_OBJECTS64个5、引用折叠所有右值引用折叠到右值引用上仍然是一个右值引用。A 变成 A所有的其他引用类型之间的折叠都将变成左值引用。 A 变成 A; A 变成 A; A 变成 A6、查看某进程堆使用情况使用cat /proc/[pid] 下面有几个文件 maps , smaps, status7、非阻塞模式下send和recv返回值的各种处理返回值返回值含义大于0成功发送或接收n个字节等于0对端关闭连接小于0errno 为EINTR、EAGAIN、EWOULDBLOCK正常可以继续发送或接收或者等待poll_in/poll_out事件触发继续发送/接收其他errno则为异常需要关闭close(fd);8、dll的使用注意一般dll库中会定义宏#ifdefMATHLIBRARY_EXPORTS#defineMATHLIBRARY_API__declspec(dllexport)#else#defineMATHLIBRARY_API__declspec(dllimport)#endif需要在dll库中定义宏MATHLIBRARY_API 使用dll库的应用不需要定义参考资料https://learn.microsoft.com/en-us/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?redirectedfromMSDNviewmsvc-1609、localtime_r也是用来获取系统时间运行于linux平台下localtime_s也是用来获取系统时间运行于windows平台下errno_tlocaltime_s(structtm*consttmDest,time_tconst*constsourceTime);structtm*localtime_r(consttime_t*timer,structtm*buf);10、linux下查看静态库文件的信息ar -t *.a 查看包含哪些.o文件nm *.a查看函数变量-C选项可以将符号名称解码使得输出更易读详细参考nm命令11、在编译静态库时如果静态库依赖另外一个静态库只需要包含头文件不需要引入库。在运行的exe中再引入静态库同时其依赖的静态库也需要引入注意引入的顺序先是直接静态库 然后是间接依赖库12、复制软链接需要使用参数 -P或者-L13、获取so文件的版本号objdump-pfilename.so|grepSONAME 或者readelf-dfilename.so14、查看二进制所依赖的库使用ldd bin二进制文件详细参考ldd命令15、在一台机器上运行没有问题但是将动态库以及二进制文件打包复制到另外一台机器上运行执行二进制文件报error while loading shared libraries,将当前目录加入到LD_LIBRARY_PATHexportLD_LIBRARY_PATH$LD_LIBRARY_PATH:./16、epoll边缘触发条件对于读操作当缓冲区由不可读变为可读的时候即缓冲区由空变为不空的时候。当有新数据到达时即缓冲区中的待读数据变多的时候。当缓冲区有数据可读且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLIN事件时。对于写操作当缓冲区由不可写变为可写时。当有旧数据被发送走即缓冲区中的内容变少的时候。当缓冲区有空间可写且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLOUT事件时。注意在同时注册了EPOLLIN|EPOLLOUT时当对端发送数据可读事件就就绪时EPOLLOUT也会触发17、.tar.bz2 格式解压为 tar -jxvf xx.tar.bz218、使用Dumpbin命令确认dll的导出函数dumpbin-exportsDll1.dll19、在使用next_permutation时如果想要遍历全排列前提条件是序列是从小到大排序的20、linux中pthread_create_key创建成功后没有先调用pthread_setspecific而是直接调用pthread_getspecific返回的是nullptr21、后台运行程序nohup./test.sh/dev/null2122、 查看进程的status信息cat/proc/13856/status23、使用overlapped注意重叠结构在函数调用中使用结构之前应始终将此结构的任何未使用成员初始化为零。 否则函数可能会失败并返回ERROR_INVALID_PARAMETERvoidreset(){Internal0;InternalHigh0;Offset0;OffsetHigh0;hEvent0;}24、list中splice的三个版本voidsplice(iterator position,listx);//将列表x添加到当前列表voidsplice(iterator position,listx,iterator i);//将列表x的第i个添加到当前列表voidsplice(iterator position,listx,iterator first,iterator last);//将列表x的[first, last)区间的添加到当前列表25、multimap和unordered_multimap的equal_range返回匹配指定key的范围迭代器如果没有找开到则将end迭代器赋值给这个范围迭代器26、unordered_set unordered_map对于自定义类型需要实现运算符重载即operator 27、在看《C设计新思维泛型编程与设计模式之应用》书籍时编译期检查通过使用不能为大小为0的数组特性来实现通过验证g上是支持大小为0的数组msvc是不支持。在vs2022上intmain(){charx[0];return0;}会报错28、查看lib库版本用dumpbin /all a.lib | findstr _MSC_VER29、函数重载匹配规则为精确匹配包括以下情况(它们具有相同且最高的匹配度)实参类型和形参类型相同。实参从数组类型或函数类型转换成对应的指针类型向实参添加顶层const或者从实参中删除顶层const形参的顶层cosnt是可以直接忽略掉的通过const转化实现匹配(底层cosnt的转换)通过类型提升实现的匹配通过算术类型转换实现的匹配通过类类型转换实现的匹配最后才是匹配可变参数函数30、decltype对表达式推导类型declval是函数模板用于伪造一个对象但不实际构造decay_t是类模板用于去除修饰符获取原始类型的31、-(指针访问对象成员操作符)优先级高于*(解引用),-(指针访问对象成员操作符)优先级高于(取地址)优先级操作符描述结合性1()[]-.::–调节优先级的括号操作符数组下标访问操作符指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作符后置自减操作符从左到右2!~–-*(type)sizeof逻辑取反操作符按位取反(按位取补)前置自增操作符前置自减操作符一元取负操作符一元取正操作符解引用操作符取地址操作符类型转换操作符返回对象占用的字节数操作符从右到左3-*.*在指针上通过指向成员的指针访问成员的操作符在对象上通过指向成员的指针访问成员的操作符从左到右4*/%乘法操作符除法操作符取余数操作符从左到右5-加法操作符减法操作符从左到右6按位左移操作符按位右移操作符从左到右7小于比较操作符小于或等于比较操作符大于比较操作符大于或等于比较操作符从左到右8!等于比较操作符不等于比较操作符从左到右9按位与操作符从左到右10^按位异或操作符从左到右11|按位或操作符从左到右12逻辑与操作符从左到右13||逻辑或操作符从左到右14? :三元条件操作符从右到左15-*/%^|赋值操作符复合赋值操作符(加法)复合赋值操作符(减法)复合赋值操作符(乘法)复合赋值操作符(除法)复合赋值操作符(取余)复合赋值操作符(按位与)复合赋值操作符(按位异或)复合赋值操作符(按位或)复合赋值操作符(按位左移)复合赋值操作符(按位右移)从右到左16,逗号操作符从左到右32、在windows中使用IOCP时发起读可以使用WSARecv读取0字节当有数据可读时在GetQueuedCompletionStatus时发起WSARecv同步读WSASend重叠发送数据时使用GetQueuedCompletionStatus时获取对应写操作时不会出现接收的字节数与发送字节数不一致情况libuv在window平台实现中就没有考虑这个发送字节数同时也可参考IOCP中多次投递WSASend33、使用fcntl时如果是设置非阻塞使用F_GETFL或者F_SETFL如果是设置close-on-exec时是使用F_GETFD或者F_SETFD34、 当类作为const引用传参时报error C2662: “sockaddr *EndPoint::data(void)”: 不能将“this”指针从“const EndPoint”转换为“EndPoint ”转换丢失限定符是因为调用的方法不是const方法可能会修改const类的属性35、不般是不建议引用指向临时对象但有一种例外就是常引用是可以指向临时对象的staticconstWinsockInitwinsockInitInstanceWinsockInit();36、在创建套接字后一般建议先设置选项再作绑定操作37、在windows平台下如果没有调用WSAStartup初始化就调用网络api接口会报WSAError: 10093错误38、accept返回错误码为EMFILE时影响有对于水平触发方式由于accept失败可读事件没有处理会一直触发可读事件继续accept一直循环浪费CPU的资源对于边沿触发试由于accept失败可读事件不会再触发不会接受新连接处理方式通过先占用一个文件描述符当accept失败时关闭占用的文件描述符再次调用accept分配成功然后关闭再次占用文件描述符idleFd_::open(/dev/null,O_RDONLY|O_CLOEXEC);//当accept错误码为EMFILE时::close(idleFd_);idleFd_::accept(acceptSocket_.fd(),NULL,NULL);::close(idleFd_);idleFd_::open(/dev/null,O_RDONLY|O_CLOEXEC);39、window下设置套接字非阻塞使用ioctlsocketunsignedlongnb1;ioctlsocket(sockfd,FIONBIO,nb);40、windows下地址长度用int表示而linux下用socklen_t表示相关的接口有bindacceptconnectsetsockoptgetsockoptgetsocknamegetpeername41、在设计双向链表时可以使用二级指针**prev来存储前一链表结点中next的地址如qt信号槽中接收者的连接链表42、在职责链模式下将上下文context作为参数传给Handler处理会导致context类膨胀可以考虑Hander处理后返回一个新的context子类context继承链Handler模板化用于阶段明确的流程std::variant表达有限状态用于状态不多的情况智能指针多态支持动态链classBaseContext{};classConcreteContext:publicBaseContext{};classHandler{public:virtual~Handler()default;virtualstd::unique_ptrBaseContexthandle(constBaseContextctx)const0;};或者类型安全的Key std::any分层Contex结构Handler自带状态Variant Visitor43、objdump命令-h显示.o文件各段信息-x显示.o文件更详细的头信息包含段信息相当于-a -f -h -p -r -t-s显示段的所有内容相当于–full-contents-d将包含指令的段反汇编44、在vs2010有c文件时编译报error C2275: uint8_t : illegal use of this type as an expression是因为VS2010 默认使用的 C89 标准不允许在代码语句中间声明变量需要将变量定义函数开头