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 に当てはまらないのでしょうか?