LFMY

导航

字节对齐

推荐两篇极好的文章:

第一篇(搜索关键字:C语言字节对齐)CSDN参考文章

第二篇(搜索关键字:#pragma pack(n) 的作用)微软面试题

总结的关键点如下:

数据成员、联合体、结构体和类来说,有几个重要概念:

1.自身对齐值:

  对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
2.指定对齐值:

  #pragma pack (value)时的指定对齐值value。
3.有效对齐值:

  自身对齐值和指定对齐值中小的那个值。

无论对结构体,还是类来讲,其内部成员都是按照“定义的先后顺序”和“各个成员自身的有效对齐值”来对齐的。

另外,在结构体、类的结尾要考虑冗余空间,以便将其定义为数组时候访问便利。

 

by the way:

为什么要字节对齐
  需要字节对齐的根本原因在于CPU访问数据的效率问题。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要 访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个 short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为 char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。

 

posted on 2014-03-22 09:49  LFMY  阅读(199)  评论(0)    收藏  举报