1、c++的默认继承方式为private
2、模板参数使用用途
- 作为容器成员类型,如STL
- 作为继承体系中的基类
- 作为继承体系中基类的模板参数
- 作为类组件的依赖组件,即依赖的接口(方法)
- 作为区分不同子类型,如boost.asio中的id与service_id<Type>和service与service_base<Type>
3、bind到成员函数时用std::bind(&class::memberFun,...)
4、WaitForMultipleObjects支持最大句柄数为MAXIMUM_WAIT_OBJECTS(64个)
5、引用折叠
- 所有右值引用折叠到右值引用上仍然是一个右值引用。(A&& && 变成 A&&)
- 所有的其他引用类型之间的折叠都将变成左值引用。 (A& & 变成 A&; A& && 变成 A&; A&& & 变成 A&)
6、查看某进程堆使用情况,使用cat /proc/[pid] 下面有几个文件: maps , smaps, status
7、非阻塞模式下,send和recv返回值的各种处理
返回值 | 返回值含义 |
---|---|
大于0 | 成功发送或接收n个字节 |
等于0 | 对端关闭连接 |
小于0 | errno 为EINTR、EAGAIN、EWOULDBLOCK正常,可以继续发送或接收或者等待poll_in/poll_out事件触发,继续发送/接收,其他errno则为异常,需要关闭close(fd); |
8、dll的使用注意,一般dll库中会定义宏
#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_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?redirectedfrom=MSDN&view=msvc-160
9、localtime_r也是用来获取系统时间,运行于linux平台下;localtime_s也是用来获取系统时间,运行于windows平台下
errno_t localtime_s(struct tm* const tmDest,time_t const* const sourceTime);
struct tm* localtime_r( const time_t* timer, struct tm* buf );
10、linux下查看静态库文件的信息
- ar -t *.a :查看包含哪些.o文件
- nm *.a:查看函数,变量,-C选项可以将符号名称解码,使得输出更易读
详细参考nm命令
11、在编译静态库时,如果静态库依赖另外一个静态库,只需要包含头文件,不需要引入库。在运行的exe中再引入静态库,同时其依赖的静态库也需要引入,注意引入的顺序,先是直接静态库, 然后是间接依赖库
12、复制软链接需要使用参数 -P或者-L
13、获取so文件的版本号
objdump -p filename.so | grep SONAME
或者readelf -d filename.so
14、查看二进制所依赖的库使用ldd bin二进制文件
详细参考ldd命令
15、在一台机器上运行没有问题,但是将动态库以及二进制文件打包复制到另外一台机器上运行,执行二进制文件报error while loading shared libraries,将当前目录加入到LD_LIBRARY_PATH
export LD_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.bz2
18、使用Dumpbin命令确认dll的导出函数
dumpbin -exports Dll1.dll
19、在使用next_permutation时,如果想要遍历全排列,前提条件是序列是从小到大排序的
20、linux中pthread_create_key创建成功后,没有先调用pthread_setspecific,而是直接调用pthread_getspecific,返回的是nullptr
21、后台运行程序
nohup ./test.sh > /dev/null 2>&1 &
22、 查看进程的status信息
cat /proc/13856/status
23、使用overlapped注意重叠结构
在函数调用中使用结构之前,应始终将此结构的任何未使用成员初始化为零。 否则,函数可能会失败并返回ERROR_INVALID_PARAMETER
void reset()
{
Internal = 0;
InternalHigh = 0;
Offset = 0;
OffsetHigh = 0;
hEvent = 0;
}
24、list中splice的三个版本
void splice (iterator position, list& x); //将列表x添加到当前列表
void splice (iterator position, list& x, iterator i);//将列表x的第i个添加到当前列表
void splice (iterator position, list& x, 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上
int main()
{
char x[0];
return 0;
}
会报错
28、查看lib库版本用dumpbin /all a.lib | findstr _MSC_VER
29、函数重载匹配规则为
- 精确匹配,包括以下情况(它们具有相同且最高的匹配度)
- 实参类型和形参类型相同。
- 实参从数组类型或函数类型转换成对应的指针类型
- 向实参添加顶层const或者从实参中删除顶层const(形参的顶层cosnt是可以直接忽略掉的)
- 通过const转化实现匹配(底层cosnt的转换)
- 通过类型提升实现的匹配
- 通过算术类型转换实现的匹配
- 通过类类型转换实现的匹配
- 最后才是匹配可变参数函数
30、decltype对表达式推导类型,declval是函数模板,用于伪造一个对象但不实际构造,decay_t是类模板,用于去除修饰符获取原始类型的