最近的一次C++相关培训,让我对C++一些细节开始注意起来,做一个简单的学习记录。
1.数据存放方式
数据存放方式与cpu有关,一般小端存放,服务器大端存放。因此,在网络进行数据传输,需要hton(主机序到网络序)和ntoh互相转换,传输以网络序为主。同理,当作为文件存放时,若需要跨机器,则需要转网络序。
2.strlen()的坑
当你要获取长度的字符串有\0
存在的时候,获取得到的不是真正的长度。
3.函数调用
当函数调用需要对字符串进行操作时,不要在函数内部进行声明局部变量,因为在return
时便已经不复存在这个变量了,其所指的地址已经被破坏。有些人的改法是作为函数内的静态变量引入,但多线程的情况下对静态变量重复赋值会导致问题。最好的方式便是字符串作为入参,以保证数据的一致性。很多标准库的函数也不是如此做的,为了保证线程安全,linux标准库采用 _r
结尾来表示该函数线程安全,同时也提供了原函数,但不保证线程安全。
4.对临时变量的正确认识
函数内的临时变量是在栈内存中生成的,栈空间(2M)十分有限,作为临时变量,其充分条件为尽量小,需小于栈空间。必要条件则是临时用。当需要很大的临时变量时,需动态生成,但必须记得释放。
5.移位操作的陷阱
C++中时常会用到移位操作,当其为一般数据都没有问题。但要注意对负数进行移位操作,需要考虑到符号位的影响,当取补码的时候,需要将原码取反加一,然后移位,将会导致得不到想要的数。
6. 对象清零的风险点
有些时候需要将对象清零,为了图方便会使用memset清零,但是这同时也导致了一个问题,清空后将无法使用。原因是有些用到虚函数的类,在初始化的时候便会创建虚表,memset将会破坏虚表,导致对象无法使用。同理,对于结构体内存在有特殊的成员变量(例如其他对象)则也慎用memset清空,最好的办法还是一一清空。
关于虚表的推荐书籍:《深入探索C++模型》
7.cmap的使用
cmap的使用,本质是HashMap,而map的本质是红黑树,Cmap在大数据量的情况下效率会很低。
8.浮点数的存放方式
a.分别计算整数,小数
b.二进制表达法
c.规则化移位
符号 指数部分移码 + 01111111111
精度分析
9. 一些常见的计算时长分析
(1)数学运算 <1ns
(2)内存 100ns
(3)I/O -网络 60us(高度调优) 100us
-文件 100ns~10ms
-控制台 100us~1ms
10.写在最后
尽量避免频繁内存的申请和释放。另外还有注意命名规范,例如全局用 g_
开头 , 成员 m_
开头, 静态 s_
开头, 指针 lp
开头, int i_
开头, double df
开头, float f
开头等等,可以避免一些由于命名不规范导致的问题,例如sprinf参数格式对不上之类的。