以下の構造体に示すように、 と の後に 1 バイトをパディングする必要がvar1
ありshort
ますvar3
。これで、合計は 6 になるはずです。これが、Visual Studio で取得している値です。また、データ構造のアライメントに関するウィキペディアでも言及されています。
typedef struct {char var1; short var2; char var3;} Bytes;
しかし、GCC ではサイズが 8 バイトになっています。挙動について教えてください。
こんにちはジャック、
以下の構造で実験を行いました。
typedef struct
{
char charVar1;
short shortVar2;
char charVar3;
}tsByte;
printf("\n Sizeo of Byte : %d", sizeof(Byte));
printf("\n Sizeo of charVar1 : %d", sizeof(Byte.charVar1));
printf("\n Sizeo of shortVar2 : %d", sizeof(Byte.shortVar2));
printf("\n Sizeo of charVar3 : %d", sizeof(Byte.charVar3));
printf("\n Address of charVar1 : %x", &Byte.charVar1);
printf("\n Address of shortVar2 : %x", &Byte.shortVar2);
printf("\n Address of shortVar3 : %x", &Byte.charVar3);
結果は以下の通りです。
Sizeo of Byte : 8
Sizeo of charVar1 : 1
Sizeo of shortVar2 : 2
Sizeo of charVar3 : 1
Address of charVar1 : 4007e90
Address of shortVar2 : 4007e92
Address of shortVar3 : 4007e94
通常、構造体が配列の要素として使用される場合、(そのすべてのメンバーの) 適切な配置を確保するために、構造体の末尾にパディングが必要です。しかし、最後の要素のパディングと少し混乱しています。「最後の要素」のパディングが 8/16/32 ビット コントローラー アーキテクチャに基づいているか、最大のメンバー サイズに基づいているか (ここでは短い)。
Visual Studio では、最大のメンバー サイズに基づいているため、サイズが 6 バイトになっているように感じます。一方、gcc コンパイラはコントローラー アーキテクチャに基づいており、私は 32 ビット コントローラーを使用しているため、4 バイト メモリに対応しています。このため、gcc コンパイラでは 8 バイトです。間違っている場合は修正してください。