5

構造体にポインターが含まれていると、構造体にメモリのオーバーヘッドがあることに気付きました。ここに例があります:

typedef struct {
    int num1;
    int num2;
} myStruct1;

typedef struct {
    int *p;
    int num2;
} myStruct2;

int main()
{
    printf("Sizes: int: %lu, int*: %lu, myStruct1: %lu, myStruct2: %lu\n", sizeof(int), 
        sizeof(int*), sizeof(myStruct1), sizeof(myStruct2));
    return 0;
}

これにより、64 ビット マシンで次のように出力されます。

Sizes: int: 4, int*: 8, myStruct1: 8, myStruct2: 16

のサイズを除いて、すべてが私には理にかなっていますmyStruct2。16 ( ) ではなく 12 しかないと思っていましたsizeof(int*) + sizeof(int) = 12

なぜこれが起こっているのか誰か説明してもらえますか?ありがとうございました!

(これはどこかで尋ねられたにちがいないと確信していますが、見つけることができませんでした。)

4

1 に答える 1

7

それはパディングです。標準では、名前のないパディングが構造体内または最後にある可能性がありますが、最初にはありません。ドラフト C99 標準セクション6.7.2.1 構造体および共用体指定子の段落13には、次のように記載されています。

[...]構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。

そしてパラグラフ15は言う:

構造体または共用体の末尾に名前のないパディングがある場合があります。

于 2013-11-13T13:19:05.567 に答える