私は構造を持っています
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
は整数変数なので 4 バイト、c
は char 変数なので 1 バイト、合計 5 バイトです。
しかし、印刷すると8 バイトsizeof(obj)
と表示されます。
理由は何ですか?
私は構造を持っています
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
は整数変数なので 4 バイト、c
は char 変数なので 1 バイト、合計 5 バイトです。
しかし、印刷すると8 バイトsizeof(obj)
と表示されます。
理由は何ですか?
32ビットシステムでは、メモリは4byte (32bit)
境界で整列されるため、4バイトの倍数である必要があります。を参照してください。Data structure alignment
int
は4バイト、char
は1バイトです。ただし、パフォーマンスが向上するため、コンパイラはそれぞれをワード(32ビットアーキテクチャではワードは4バイト)に揃えます。struct
したがって、の各インスタンスはEData
2ワード(または8バイト)に切り上げられます。
最終的には次のようになります。
typedef struct EData {
int a;
char c;
char padding[3];
}
お気づきのサイズの増加は、コンパイラのパディングによるものです。
コンパイラは、正しいバイト境界を強制するために余分なバイトを追加します。
そのため、コンパイラは余分なバイトを追加して、各メンバーのタイプに応じて適切な場所を強制します。
これを行うためにコンパイラを停止するオプション (packed ディレクティブ) がありますが、それを避けるのが最善です (コーナー ケースを除く)。
問題がある場合は、#pragma
またはコンパイラ スイッチを使用できます (さまざまなコンパイラにこのようなスイッチがあります)。