考虑以下C ++代码,该代码打印double
的对齐要求以及double
类型的结构成员的有效对齐:
#include <iostream>
struct S { short x; double y; };
int main() {
S s;
std::cout << __alignof(double) << ' ';
std::cout << (char*)&s.y - (char*)&s << std::endl;
}
我正在使用x86上的gcc编译此代码。
我希望此程序输出8 8
,但它会打印8 4
。 为什么?
答案 0 :(得分:2)
对象的对齐在结构的外部和内部可以是不同的。在结构之外,它可能是允许最快访问的最小对齐(例如8字节)。但在结构内部,它可能是需要最少填充的一些值(x86上的4个字节)。一些编译器允许您控制结构打包(gcc:__attribute__((pack))
,microsoft:#pragma pack()
)
编译器究竟做了什么,它由您系统的ABI决定。如果ABI表示结构值没有比四个字节更大的填充,那么编译器将符合这一点。