2
typedef struct structc_tag
{
   char        c;
   double      d;
   int         s;
} structc_t;

ブログで、これには 24 バイトのデータが必要であると読みました。

sizeof(char) + 7 バイトのパディング + sizeof(double) + sizeof(int) + 4 バイトのパディング = 1 + 7 + 8 + 4 + 4 = 24 バイト。

私の質問は、なぜ 7 バイトのパディングなのかということです。3 バイトのパディングを使用して、次の 8 バイトを double に使用できないのはなぜですか? そして、最後の 4 バイトの必要性は何ですか?

4

2 に答える 2

3

これらの構造体の配列を次のように割り当てるとどうなるかを考慮する必要がありますmalloc()

structc_t *p = malloc(2 * sizeof *p);

のプラットフォームを考えてみましょうsizeof(double) == 8sizeof(int) == 4の必要なアラインメントdoubleは 8 です。malloc()は常に、任意の C 型を格納するために正しくアラインされたアドレスを返します。この場合、aアラインメントは 8 バイトになります。パディング要件は自然に抜け落ちます。

  • a[0].dしたがって、 を 8 バイトにアラインするには、 の後に 7 バイトのパディングが必要ですa[0].c

  • a[1].d8 バイトにアラインするには、構造体全体のサイズが 8 の倍数である必要があるため、 の後に 4 バイトのパディングが必要ですa[0].s

struct大きいものから小さいものへと並べ替えると、次のようになります。

typedef struct structc_tag
{
   double      d;
   int         s;
   char        c;
} structc_t;

...その後、.c構造体のサイズを 8 の倍数にするために必要な唯一のパディングは、 の後の 3 バイトです。これにより、構造体の合計サイズは 24 ではなく 16 になります。

于 2012-08-10T04:41:36.500 に答える
2

プラットフォームに依存しますが、何doubleに合わせているかによって異なります。この場合のように見える 8 バイトにアラインされている場合、3 バイトのパディングはそれをカットしません。

4 バイトにアラインされている場合doubleは正しく、3 バイトのパディングが使用されます。

于 2012-08-09T17:38:35.420 に答える