c++总结(持续更新中)

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对端关闭连接
小于0errno 为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是类模板,用于去除修饰符获取原始类型的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值