4

実際の構造サイズを知るにはどうすればよいですか?sizeofを使用すると、アライメント後のバイト数が返されます。例えば ​​:

struct s {
               char c;
               int i
}

sizeof(s)= 8; アラインメントなしのバイトサイズ、つまり5を取得することに興味があります

4

3 に答える 3

8

構造の実際のサイズは、位置合わせ後の構造のサイズです。sizeofメモリ内の構造体の戻りサイズを意味します。バイトに揃えられた構造が必要な場合は、コンパイラにそのように指示する必要があります。たとえば、次のようなものです。

#ifdef _MSVC
#  pragma pack(push)
#  pragma pack(1)
#  define PACKED
#else
#  define PACKED            __attribute((packed))
#endif
struct byte_aligned {
    char c;
    int i;
} PACKED;
#ifdef _MSVC
#  pragma pack(pop)
#endif

sizeof(byte_aligned)5とその実際の5バイトをメモリに返します

于 2012-08-29T13:54:04.347 に答える
2

sizeofは、実際の構造体のサイズを返します。

パディングなしのサイズは、コンパイラが適切と思われるパディングを挿入するため、少し意味がありません。一部のコンパイラは、構造体のパディングをオフにするプラグマをサポートしています。その場合はそれを使用する必要がありますが、おそらくあらゆる種類の楽しいことが起こります。

于 2012-08-29T13:54:32.780 に答える
0

ドキュメントを誤解しました。

sizeofを使用すると、アライメント後のバイト数が返されます

これは正しくありません。パディングsizeof後のバイト数を返しますが、これは同じではありません。

したがって、あなたが知りたいのが「私の構造がどれだけのスペースを取るか」でsizeof()あるならば、それはあなたに正しい答えを伝えています。

于 2012-08-29T15:08:14.453 に答える