14-增加变量的对齐
增加变量的对齐
除了支持变量紧凑存储,GCC还支持编程人员为给定变量指定最小的对齐方式。这样,GCC就会对指定的变量按(大于等于)指定值进行对齐,这与体系结构和ABI所指定的最小对齐方式相反。举个例子,以下声明表示名为beard_length的整数,最小对齐方式是32个字节(这和传统的在32位机器上按4个字节对齐的方式不同):
只有当硬件需要比体系结构有更高的对齐需求时,或者当手动处理C和汇编代码,需要指定特殊的对齐值时,强制指定类型对齐值才有意义。使用这种对齐功能的一个例子是在处理器缓存中保存经常使用的变量,从而优化缓存行为。Linux内核就使用了这种技术。
除了指定特定最小的对齐值外,GCC把给定类型按最小对齐值中的最大值进行分配,这样可以适用于所有的数据类型。举个例子,以下使用方式会告诉GCC把parrot_height按其使用最大值进行对齐,很可能是按照double类型进行对齐:
这种解决方案通常是对空间/时间的权衡:以这种方式进行对齐的变量会消耗更多的空间,但是对这些数据进行拷贝(以及其他复杂操作)很可能会更快,因为编译器可以发送处理大量内存的机器指令。
计算机体系结构或系统工具链的方方面面可能会对变量对齐有最大值限制。举个例子,在某些Linux体系结构中,链接器无法识别超出一个很小的默认区间的对齐。在这种情况下,通过关键字提供的对齐方式就变成允许的对齐值的最小值。举个例子,假设你希望按照32字节进行对齐,但是系统的链接器最多只能按8个字节进行对齐,那么变量就会按照8字节进行对齐。