有这段代码:
#include <iostream>
struct A {
double a;
};
int main(){
std::cout << alignof(A) << std::endl; // prints 4
std::cout << alignof(double) << std::endl; // prints 8
return 0;
}
为什么结构A
和原始double
类型的对齐方式不同?我正在使用Linux 32位。
答案 0 :(得分:3)
我在这里找到了一个可能的解释:Implementation of alignof
有关对齐的惊人事实
在现代x86处理器上,double类型最有效地以8的倍数对齐。实际上,gcc在堆栈帧中以8的倍数对齐“free”双精度。不幸的是,古老的ABI要求结构中double的对齐是4.意外的结果是,在x86 Linux上,gcc已经
struct Double { double d; }; __alignof__ (double) == 8 __alignof__ (Double) == 4;
同样古老的ABI指出long double的大小是12.因为对齐必须是大小的一个因素,我们有一个奇怪的情况:
__alignof__ (double) == 8 __alignof__ (long double) == 4;
尽管long double“想要”至少与double一致。
幸运的是,它并不重要,因为我们从不关心非结构成员类型的对齐。