8

为 32 位 x86 linux 运行以下代码(编译器标志:g++ -std=c++14 -m32)时,我得到了意想不到的结果。我尝试了 gcc 和 clang。

#include <iostream>
using namespace std;

struct S1
{
  uint64_t a;
  uint32_t b;
};

struct S2
{
  alignas(uint64_t) char a[8];
  uint32_t b;
};

int main()
{
  cout << "sizeof(S1)=" << sizeof(S1) << endl;
  cout << "sizeof(S2)=" << sizeof(S2) << endl;
}

输出是:

sizeof(S1)=12
sizeof(S2)=16

这里发生了什么?为什么 S1 和 S2 的大小不同?据我了解,64 位整数值在 32 位 x86 机器上与 32 位对齐。这确实解释了为什么 S1 的大小是 12 字节。但是为什么这不适用于 S2?

4

1 回答 1

4

alignof关键字衡量一个类型作为一个完整对象的对齐方式;即当它被分配为单个对象或数组元素时。这不一定与该类型作为子对象的对齐要求相同;POD 结构或标准布局类型的成员是否保证根据其对齐要求对齐?

x386 ABI 要求 struct 中 64 位整数的对齐方式为 4 字节;gcc 不能随意更改它,因为它会破坏与其他目标文件和程序的二进制兼容性。但是,它可以将完整对象的 64 位整数对齐到 8 个字节,因为这样做不会影响 ABI,并且可以更有效地访问内存。

于 2016-01-06T15:53:05.870 回答