在32位平台上的结构中对齐

时间:2016-01-06 13:27:41

标签: c++ padding alignas

在为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?

1 个答案:

答案 0 :(得分:4)

alignof关键字测量类型作为完整对象的对齐方式;即,当它被分配为单个对象或数组元素时。这不一定与作为子对象的该类型的对齐要求相同; Are members of a POD-struct or standard layout type guaranteed to be aligned according to their alignment requirements?

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