5

次のように定義された構造体があります。

struct smth
{
    char a;
    int b[];
};

この構造体を呼び出すsizeofoffsetof:

cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;

出力は次のとおりです。

4
4

stuct のサイズが 4 で、char が 1 バイトを使用しているのに、int 配列のオフセットが 4 なのはなぜですか? なぜある種のパディングがあるのですか?また、int 配列がまったくスペースを占有しないのはなぜですか?

4

3 に答える 3

8

stuct のサイズが 4 で、char が 1 バイトを使用しているのに、int 配列のオフセットが 4 なのはなぜですか? なぜある種のパディングがあるのですか?

C 標準で許可されているため、パディングがあります。コンパイラは、多くの場合、パフォーマンスを向上させるために変数を整列させます。

また、2 番目の変数がまったくスペースを占めていないのはなぜですか (これは事実のようです)。

これは C99 の柔軟な配列メンバーです。それが全体の要点です。アイデアは、次のような構造を割り当てることです。

struct smth *s = malloc(sizeof *s + 10 * sizeof s->b[0]);

そして、あたかもb10 要素の配列であるかのように動作する構造が得られます。

于 2013-08-17T15:15:32.037 に答える
3

メンバーのサイズがゼロであり、コンパイラがとメンバーbの間にパディングを追加して、「単語」境界になるためです。abb

ただし、そのような構造に柔軟な配列があることを正しく覚えていれば、有効な C のみであり、コンパイラ拡張機能を除いて C++ ではありません。

于 2013-08-17T15:16:28.607 に答える
2

OPは質問がC++であるとコメントしているので:

struct smth
{
    char a;
    int b[];
};

C++ では配列 likeb[]は無効です。配列は固定サイズでなければなりません。可変長配列は C99 でのみ有効です。

コンパイラが拡張機能としてサポートしていると仮定すると、配列b[]のサイズはゼロになり、メンバーのみを含む構造体になりcharます。パディングのルールが機能し、マシンでは 4 バイトのワードにstructパディングされます。struct

于 2013-08-17T15:30:51.393 に答える