为什么gcc不尊重对齐要求?

时间:2012-07-18 15:41:19

标签: gcc alignof

考虑以下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;
}

Run on codepag.org

我正在使用x86上的gcc编译此代码。

我希望此程序输出8 8,但它会打印8 4为什么?

1 个答案:

答案 0 :(得分:2)

对象的对齐在结构的外部和内部可以是不同的。在结构之外,它可能是允许最快访问的最小对齐(例如8字节)。但在结构内部,它可能是需要最少填充的一些值(x86上的4个字节)。一些编译器允许您控制结构打包(gcc:__attribute__((pack)),microsoft:#pragma pack()

编译器究竟做了什么,它由您系统的ABI决定。如果ABI表示结构值没有比四个字节更大的填充,那么编译器将符合这一点。