4

このプログラムの出力は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));
4

5 に答える 5

5

おそらく、「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 です。

于 2012-05-24T18:57:50.037 に答える
1

64ビットシステムの場合、システムサイズはchar-1バイト(4バイトではない)int-4バイト長double-12バイト

したがって、合計は1 + 4 + 4 + 4 + 12 + padding=28バイトです!!

于 2012-05-24T19:44:38.987 に答える
1

thisによると、gcc 32 ビット モード (gcc -m32プラットフォームが実際に何であるかに関係なく、32 ビット出力を生成するように構築された gcc を使用または使用) の long double は、4 バイトのみでアライメントされます。ただし、gcc のマニュアルを参照して確認することをお勧めします。

于 2012-05-24T20:01:58.043 に答える
0

それは私には正しいようです。p の直後のフィールドは 4 バイトでアラインされるため、構造体の最後にパディングする必要はありません。

4+4+4+4+12=28

私のシステムでは、出力は 32 ですが、私のシステムでは、sizeof(long double) は 16 です (x86_64、LLVM3)。

于 2012-05-24T20:52:32.573 に答える
0

28 のsizeof出力はもちろん正しいです = char の場合は 1 バイト、パディングは 3 バイト、3 x 4 int、long double の場合は 12 バイト (サイズは 96 ビット、精度は 80 ビット)、合計で 28 バイトになります。

x86-64 マシンでコンパイルする場合でも、おそらく mingw32 を使用して x86-32 マシン用にコンパイルすると、違いが生じることに注意してください。

Mingw32 は、long double.

于 2012-05-24T20:53:48.933 に答える