1

私は構造を持っています

typedef struct EData
{
    int a;
    char c;
}
Edata obj;

aは整数変数なので 4 バイト、cは char 変数なので 1 バイト、合計 5 バイトです。

しかし、印刷すると8 バイトsizeof(obj)と表示されます。

理由は何ですか?

4

4 に答える 4

4

32ビットシステムでは、メモリは4byte (32bit)境界で整列されるため、4バイトの倍数である必要があります。を参照してください。Data structure alignment

于 2010-12-31T10:13:21.373 に答える
3

intは4バイト、charは1バイトです。ただし、パフォーマンスが向上するため、コンパイラはそれぞれをワード(32ビットアーキテクチャではワードは4バイト)に揃えます。structしたがって、の各インスタンスはEData2ワード(または8バイト)に切り上げられます。

最終的には次のようになります。

typedef struct EData {
    int a;
    char c;
    char padding[3];
}
于 2010-12-31T10:13:09.373 に答える
1

お気づきのサイズの増加は、コンパイラのパディングによるものです。
コンパイラは、正しいバイト境界を強制するために余分なバイトを追加します。
そのため、コンパイラは余分なバイトを追加して、各メンバーのタイプに応じて適切な場所を強制します。
これを行うためにコンパイラを停止するオプション (packed ディレクティブ) がありますが、それを避けるのが最善です (コーナー ケースを除く)。

于 2010-12-31T10:21:12.170 に答える
0

問題がある場合は、#pragmaまたはコンパイラ スイッチを使用できます (さまざまなコンパイラにこのようなスイッチがあります)。

于 2010-12-31T10:20:08.120 に答える