30

たとえば、私はclass

クラスナイーブ{
公衆:
    char a;
    長い長いb;
    char c;
    int d;
};

私のテストプログラムによると、atodは次のように次々と構築されます

-------
bbbbbbbb
c---dddd

-未使用という意味です。

なぜC++はそれをよりタイトにしないのですか?

ac--dddd
bbbbbbbb
4

1 に答える 1

56

クラスおよび構造体のメンバーは、宣言されたのと同じ順序でメモリに格納されることが標準で要求されています。したがって、あなたの例では、のd前に表示することはできませんb

また、ほとんどのアーキテクチャでは、マルチバイト型が 4 バイトまたは 8 バイト境界に整列されることを好みます。したがって、コンパイラができることは、クラス メンバー間に空のパディング バイトを残すことだけです。

サイズの増減順にメンバーを自分で並べ替えることで、パディングを最小限に抑えることができます。または、コンパイラに#pragma packオプションまたは類似のものがある場合があります。これは、パフォーマンスとコードサイズを犠牲にしてパディングを最小限に抑えようとします。コンパイラのドキュメントを読んでください。

于 2011-07-18T09:08:56.527 に答える