【解決方法】以下のコードの構造体のサイズ


#include <stdio.h>

struct test
{
    unsigned char first;
    int second;
    unsigned char three;
    struct test *fourth;

};

int main()
{
    struct test node;
    printf("%d\n", sizeof(node));
    return 0;
}

私が試したこと:

In the above code the size of the structure in 64 bit processor should be 20 but why am I getting answer 24? can any one explain please.

解決策 1

64 ビット アラインメント: 4 + 4 + 4 + (4) + 8。

解決策 2

プロセッサは常にアイテムを「自然な」境界に揃えます。したがって、32 ビット整数は、たとえば 32 / 8 で割り切れるアドレスで常に開始されます (32 ビット、1 バイトあたり 8 ビット – したがって、整数のアドレスは常に割り切れます)。 4 で余りはありません)。
したがって、最初の要素は 1 バイトを使用しますが、次の項目は 32 ビット境界に揃える必要があるため、そこに到達するために 3 つの「パディング バイト」が追加されます。
同じことがあなたにも起こります three 要素 – ポインターが後に続くため、64 ビット境界に到達するためにパディング バイトが追加されます。
そう:

Address  value
00       first  (8 bit byte)
01       padding
02       padding
03       padding
04       second (32 bit int)
05       second
06       second
07       second
08       three  (8 bit byte)
09       padding
10       padding
11       padding
12       padding
13       padding
14       padding
15       padding
16       fourth (64 bit pointer)
17       fourth (64 bit pointer)
18       fourth (64 bit pointer)
19       fourth (64 bit pointer)
20       fourth (64 bit pointer)
21       fourth (64 bit pointer)
22       fourth (64 bit pointer)
23       fourth (64 bit pointer)

合計: 24 バイト。
それを確認するには、交換します secondthree パディングが少なくて済みます。

C++
struct test
{
    unsigned char first;
    unsigned char three;
    int second;
    struct test *fourth;

};

Address  value
00       first  (8 bit byte)
08       three  (8 bit byte)
02       padding
03       padding
04       second (32 bit int)
05       second
06       second
07       second
08       fourth (64 bit pointer)
09       fourth (64 bit pointer)
10       fourth (64 bit pointer)
11       fourth (64 bit pointer)
12       fourth (64 bit pointer)
13       fourth (64 bit pointer)
14       fourth (64 bit pointer)
15       fourth (64 bit pointer)

合計: 16 バイト。

実際、それらを適切に並べ替えると、すべての要素と別の値を同じスペースに収めることができます。

C++
struct test
{
    struct test *fourth;
    int second;
    unsigned char first;
    unsigned char three;
    short five;
};

合計: 16 バイト

解決策 3

構造体{
int32 私;
ボイド*v;
unsigned char c;
unsigned char バッファ [0];
};

コメント

タイトルとURLをコピーしました