深入理解计算机系统------->对齐限制笔记

来源:互联网 发布:win10 mac 编辑:程序博客网 时间:2024/06/04 21:47

   对齐限制

      c语言中在用sizeof()函数判断一个结构体类型(struct)所占字节大小的时候会发现它可能比理论上的所占字节大小要大。这是由于许多计算机系统对基本数据类型的 可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值k(通常是2,4,8)的倍数,这称为对齐限制。这种限制可以简化处理器和存储器系统之间的接口的硬件设计。

        例子,假设一个处理器总是从存储器中取8字节数据,则地址必须为8的倍数。如果将所有的double类型的对象地址对齐成8的倍数,那么用一次的存储器操作就能完成读写操作。

        当然无论数据是否对齐,计算机都能正确执行。对象的地址对齐是以空间换时间来提高处理效率。大多数编译器在编译的时候给出了是否对齐的选项。默认是对齐的。

        Linux使用的对齐策略是2字节数据类型的地址必须是2的倍数,而较大的数据类型(int,int*,float,double)的地址必须是4的倍数。也就是要求一个short类型的地址的最低位必须等于0.而较大的数据类型的地址最低两位必须都是0.

       注意Linux上可以使用命令行-malign-double使GCC为double类型的数据使用8字节的对齐方式,但在与用4字节对齐方式下编译的库代码链接时,会导致不兼容。

        Windows对齐方式是,任何k字节基本对象的地址都必须是k的倍数。也就是说int类型的对象地址是4的倍数,double类型的对象地址是8的倍数。

         所以合理的类型对象声明顺序会,节约内存空间。

         例子:

typedef struct  {int a;int b;char c; }s1;

根据对齐限制的要求,

s1占用9个字节的空间,但事实并非如此。如果s1类型的对象占9个字节的空间那么,对于对象s1 temp[2]。对象temp[1]地址为9的倍数,其中成员就不满足对齐限制的要求。所以s1类型的数据对象占用的空间是12个字节,以满足在数组类型下地址对齐的要求。


                        

在理解了对齐限制后,就明白了结构体所占空间为逻辑不相等的原因。