好久没来这里了,一个多月没来,今天上来,发现有人对我以前转载的一篇关于struct对齐的文章提到的东东,提出了很好的质疑,我很感谢这位仁兄,关于这个问题,网上帖子很多,自己看了,觉得也没啥好整理的,看大牛的吧,以下是各大牛文章的链接,我就权当是Mark一下吧,呵呵。
关于指针和数组、结构和类的sizeof讲解
http://blog.vckbase.com/billdavid/archive/2004/06/23/509.html关于联合体的sizeof讲解
http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html关于对齐的小结性文章
http://blog.vckbase.com/zhangjw_cn/archive/2005/08/09/10701.html自己懒得打开链接,再把小结性文章的小结,也拿来转一下。
最后得到了以下结论:
1. 成员的对齐是按声明顺序进行的;
2. 对齐值由编译指示和最大成员两者较小的值决定;
3. 未对齐到对齐值的成员一起形成块对齐(联合对齐);
4. 上一个(下一个)对齐采用自己较大则不变,自己较小则填充自己对齐到上一个(下一个)大小;
5. 每成员对齐:如果前面已对齐到对齐值,下一个对齐自己。如果前面未对齐到对齐值,如果加上下一个成员不大于对齐值,下一个对齐自己,否则填充自己块对齐到对齐值。
6. 最后还未对齐到对齐值的,填充空间块对齐到对齐值。
从这些结论,可以得到:
1. 以上的对齐原则其实是尽量整齐排列、尽量节省内存。
2. 声明成员应该尽量避免不同类型错杂开来,最好采用从小到大或者从大到小的顺序(错开后,会因为上对齐和下对齐而增加填充开销)。
3. 编译器缺省采用8字节对齐主要是因为最大基本类型为8自己(以前自己不明白,在论坛提过问,后来,以为是SSE指令的原因)。
4. 手算sizeof是没有必要的,负责的(可以先对齐出对齐块,用块数乘对齐值)。
posted on 2006-12-27 00:01
frank.sunny 阅读(601)
评论(0) 编辑 收藏 引用 所属分类:
C/C++学习和实践