我们在一些一个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/