franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte
好久没来这里了,一个多月没来,今天上来,发现有人对我以前转载的一篇关于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 阅读(594) 评论(0)  编辑 收藏 引用 所属分类: C/C++学习和实践

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜