4

考虑以下 C++ 代码,它打印 a 的对齐要求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;
}

在 codepag.org 上运行

我在 x86 上用 gcc 编译这段代码。

我期待这个程序能够输出8 8,但是它会打印出来8 4这是为什么?

4

1 回答 1

2

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

编译器究竟做了什么,它由系统的 ABI 决定。如果 ABI 说结构值的填充不超过四个字节,那么编译器将遵守这一点。

于 2012-07-18T16:42:27.347 回答