[ad_1]
#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 バイト。
それを確認するには、交換します second
と three
パディングが少なくて済みます。
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];
};
[ad_2]
コメント