構造体のパディング(別名メモリアライメント)のため。アラインメントは 2 のべき乗でなければなりません (C11 は @KeithThompson が述べたように 6.2.8p4 でこれを明示的にします)。また、構造体の合計サイズが 5 であるため、最も近い 4 の倍数は 8 であるため、8 になります。アライメントは 2 の累乗でなければなりません。
#pragma pack
ぴったりサイズでお使いいただけます。
#pragma pack(push, 1) /* set alignment to 1 byte boundary */
struct A {
char s;
int a;
};
#pragma pack(pop) // restore to default
警告: #pragma pack
標準 C にはありません。また、構造体に 4 バイト アラインメントが必要であるという前提もありません。@KeithThompsonが述べたように。
「型のサイズはそのアラインメントの倍数でなければなりませんが、サイズは 2 の累乗である必要はありません。たとえば、4 バイトの int を想定すると、次のような構造struct { int a, b; char d; }
はアラインメントが 4 でサイズが 12 になる可能性があります。 . サイズは、最も近い 2 の累乗ではなく、配置の最も近い倍数です。- @キーストンプソン
パッキングは、メモリを減らすのに役立ちます。整数や固定長の char などでいっぱいの構造体がある場合に使用します。ポインターで使用するのが適切かどうかはわかりませんが、ポインターを使用する場合には有用ではありません (たとえばvoid *
、構造体)。
詳細はこちら