C++常见陷阱

最近的一次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参数格式对不上之类的。