browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

字节对齐小结

Posted by on 2006 年 04 月 05 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

应3月下旬时候wencui大姐之邀,在此将字节对齐的问题小小总结一下。我并不打算把这个总结写成学究派那种苛求“回”字四样写法的样子,因此这里只是简要总结是什么、为什么的问题。我在其中给了几个最简单的小例子来说明这一问题,顺便说一句,我贼反感某些考试中在字节对齐上做文章的手法——一个sizeof就能搞定的问题,装TMD什么孙子。

  1. 什么是字节对齐以及为什么要字节对齐。所谓字节对齐就是C/C++编译器为了加速CPU寻址速度而采用的一种策略,通常的表现是将结构中某些不足CPU字长的成员填入若干字节的垃圾值使整个结构的大小成为CPU字长的整数倍。(所谓CPU的字长,可以简单地理解为一个sizeof(int)的大小。)
  2. 字节对齐的例子。在此列出一段代码,附有相关注释,不多解释。 
    C++代码
    1. struct A // size: sizeof( int ) * 2   
    2. {   
    3.     char c;   
    4.     int  n;   
    5. };   
    6.   
    7. struct B // size: sizeof( int ) * 3   
    8. {   
    9.     char c1;   
    10.     int  n;   
    11.     char c2;   
    12. };   
    13.   
    14. struct C // size: sizeof( double ) * 2   
    15. {   
    16.     int    n;   
    17.     double lf;   
    18. };  
  3. 可以说字节对齐是一种以空间换时间的做法。但如果某种情况下,程序员需要将struct A的10000个成员写入文件,那么在32位系统中,这个文件就会浪费30000个字节的空间,浪费率达到了37.5%。这时候的解决方式是改变默认的字节对齐方式,具体实现是利用了#pragma链接器指令。下面的例子使用了1字节的对齐,也就是不对齐。 
    C++代码
    1. #pragma pack( push, 1 )   
    2. struct D // size: 1 + sizeof( int )   
    3. {   
    4.     char c;   
    5.     int  n;   
    6. };   
    7. #pragma pack( pop )  

    该指令的使用方法不止此一种,更多信息请参考MSDN。

  4. 1字节的对齐还有其它一些魔术般的作用,譬如可将指令的机器码写入某种结构,然后使之执行。ATL的CWndProcThunk就采用了这种手段,参见atlwin.h。

订阅本站

4 Comments

  • At 2006.04.05 17:36, mayulei said:

    草草看了一遍,基本上不知所云。
    隔行如隔山,
    同行差得也很远啊。
    唯一印象比较深刻的一句就是“装TMD什么孙子。”

    • At 2006.04.05 17:37, mayulei said:

      咦~~
      沙发啊。

      • At 2006.04.06 12:58, said:

        我们的队伍向太阳

        • At 2006.04.07 12:37, mayulei said:

          李马最近更新速度放慢了啊。

          (Required)
          (Required, will not be published)