字节对齐
推荐两篇极好的文章:
第一篇(搜索关键字: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,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。
浙公网安备 33010602011771号