在为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?
答案 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,并且可以更有效地访问内存。