在为32位x86 linux运行以下代码时,我得到了意想不到的结果(编译器标志:g ++ -std = c ++ 14 -m32).我试过gcc和clang.
#includeusing 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呢?