このプログラムの出力は28です。方法がわかりませんか?私によると、これは32(4 + 4 + 4 + 4 + 12)+ 4(位置合わせを維持するため)=32である必要があります。出力28を表示する理由を説明してください。
struct test{
char c;
int d;
int x;
int y;
long double p;
}t1;
printf("%d",sizeof(t1));
このプログラムの出力は28です。方法がわかりませんか?私によると、これは32(4 + 4 + 4 + 4 + 12)+ 4(位置合わせを維持するため)=32である必要があります。出力28を表示する理由を説明してください。
struct test{
char c;
int d;
int x;
int y;
long double p;
}t1;
printf("%d",sizeof(t1));
おそらく、「long double」は実際には double (8 バイト) と同じであり、32 ビット プロセッサを使用している場合、アライメントは 4 バイトです。
4+4+4+4+8 = 24
とはsizeof(long double)
?
編集:
私はGCCを使用__builtin_offset_of()
し__alignof__
て調査しました。構造体のサイズを説明する実際の答えは次のとおりです。
4+4+4+4+12 = 28
sizeof(long double)
は12です。
__alignof__(long double)
は 4 andであるため、パディングは必要ありません。興味深いことに、__alignof__(double)
は 8 です。
64ビットシステムの場合、システムサイズはchar-1バイト(4バイトではない)int-4バイト長double-12バイト
したがって、合計は1 + 4 + 4 + 4 + 12 + padding=28バイトです!!
thisによると、gcc 32 ビット モード (gcc -m32
プラットフォームが実際に何であるかに関係なく、32 ビット出力を生成するように構築された gcc を使用または使用) の long double は、4 バイトのみでアライメントされます。ただし、gcc のマニュアルを参照して確認することをお勧めします。
それは私には正しいようです。p の直後のフィールドは 4 バイトでアラインされるため、構造体の最後にパディングする必要はありません。
4+4+4+4+12=28
私のシステムでは、出力は 32 ですが、私のシステムでは、sizeof(long double) は 16 です (x86_64、LLVM3)。
28 のsizeof
出力はもちろん正しいです = char の場合は 1 バイト、パディングは 3 バイト、3 x 4 int、long double の場合は 12 バイト (サイズは 96 ビット、精度は 80 ビット)、合計で 28 バイトになります。
x86-64 マシンでコンパイルする場合でも、おそらく mingw32 を使用して x86-32 マシン用にコンパイルすると、違いが生じることに注意してください。
Mingw32 は、long double
.