大量创建的对象需要谨慎构建其数据成员

来源:互联网 发布:php源码加密软件 编辑:程序博客网 时间:2024/05/23 17:32

我们在一些一个class或者struct时,数据成员的顺序对程序的编译和执行没有什么影响,但对class或struct占用的空间却可能产生影响。因此适当的排列数据成员的顺序,以及精心的计划class或struct中数据成员的大小,对于那些需要创建几万、几十万、几千万的对象来说,空间上的差别就很有价值了。

下面先看看一个利用struct将一个4字节的整数分成两部分用的例子:

struct PackStruct {  unsigned int char_:8;  unsigned int frequence_:24;}

这个结构占据了4个字节,它用unsigned int的前8位用于存储1个字符,而后24位用于存储该字符的频率,频率可以存储2的24次方个,也就是说可以统计16777216个字符的文本,也就是16M的文本,如果超出了16M,那么可能会产生频率的溢出(当16M都是同一个字符时)。

如果将结构定义为下面的形式:

struct UnpackStruct {  char char_;  unsigned int frequence_;}

UnpackStruct看似仅仅增加了1个字节,但实际UnpackStruct占用了8个字节,这主要是因为C++缺省使用4字节对齐的缘故,这样的对齐有利与提高存取速度,是一种以空间换时间的策略。

参考文献[1]对C++数据的对齐进行了非常全面的分析,是一篇非常有价值的文章。

参考文献:

[1]http://pppboy.blog.163.com/blog/static/30203796201082494026399/