私は構造を持っています
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したがって、の各インスタンスはEData2ワード(または8バイト)に切り上げられます。
最終的には次のようになります。
typedef struct EData {
int a;
char c;
char padding[3];
}
お気づきのサイズの増加は、コンパイラのパディングによるものです。
コンパイラは、正しいバイト境界を強制するために余分なバイトを追加します。
そのため、コンパイラは余分なバイトを追加して、各メンバーのタイプに応じて適切な場所を強制します。
これを行うためにコンパイラを停止するオプション (packed ディレクティブ) がありますが、それを避けるのが最善です (コーナー ケースを除く)。
問題がある場合は、#pragmaまたはコンパイラ スイッチを使用できます (さまざまなコンパイラにこのようなスイッチがあります)。