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