有这个代码:
#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 位。
我在这里找到了一个可能的解释:alignof 的实现
关于对齐的惊人事实
在现代 x86 处理器上,double 类型以 8 的倍数对齐最有效。事实上,gcc 在堆栈帧内以 8 的倍数对齐“自由”双精度。不幸的是,古老的 ABI 要求结构中双精度数的对齐方式为 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 一样对齐。
幸运的是,这并不重要,因为我们从不关心不是结构成员的类型的对齐方式。