C++ 標準 (C から継承) によれば、空の構造体のサイズはゼロではありません。その理由は (私見では残念ですが)、2 つの異なる変数には異なるアドレスが必要であるためです。空の構造体を継承しても、必ずしもオブジェクトが「膨張」するわけではありません。ただし、状況によってはそうなることもあります。
私はかなり洗練されたクラス アーキテクチャを持っており、これには激しいテンプレートの呪術が伴います。その結果、最終的なクラス (作成する必要のあるインスタンス) には、継承された複数の空の構造体が含まれる可能性があります。この事実により、それらの一部は最終的に膨張する可能性があります。そして最悪なのは、メモリ レイアウトが実際には継承の順序に依存することです。
可能であれば、これらすべてを取り除きたいです。
実際に標準を破る代償として、このスペースの無駄をなくすように構成できる C++ コンパイラはありますか?
編集:
つまり、次のようになります。
struct Empty1 {};
struct Empty2 {};
struct NonEmpty {
int Value;
};
struct MyClass1
:public NonEmpty
,public Empty1
,public Empty2
{
};
struct MyClass2
:public Empty1
,public NonEmpty
,public Empty2
{
};
struct MyClass3
:public Empty1
,public Empty2
,public NonEmpty
{
};
STATIC_ASSERT(sizeof(MyClass1) == 8);
STATIC_ASSERT(sizeof(MyClass2) == 4);
STATIC_ASSERT(sizeof(MyClass3) == 8);
空の構造体はオブジェクトを膨張させるだけでなく (そのようなものが複数継承されている場合)、結果は空の構造体の継承順序によっても異なります。
ベストアンサー1
の空ベースの最適化空のベースが、いわゆるオブジェクトを「膨張」させないようにするものです。ただし、オブジェクトが同じ空のベースから 2 回継承しないように注意する必要があります。そうしないと、この最適化は許可されません。これを回避する方法は、空のベースをテンプレート化し、同じ空のテンプレートのインスタンス化が複数回継承されないようにインスタンス化することです。
基本クラスが具体的なクラスのタグ付けに使用されている場合は、設計を非侵入的なものに変更することを検討できます。