C++では、ほとんどの最適化は、if-ifルールから派生しています。つまり、最適化が行われなかった場合にプログラムが動作する限り、それらは有効です。空のデータメンバーの最適化:可能でしょうか?
空の基本最適化はそのようなトリックです:条件によっては、基本クラスが空の場合(非静的なデータメンバーを持たない場合)、コンパイラはそのメモリ表現を削除することがあります。 n3225から、[クラス]
:は、どうやらそれはまだ場所の少なくとも1バイト分を取る必要があり、それはデータメンバが空でもあり、標準のデータメンバーに、この最適化を禁止しているようです
4 - クラス型の完全なオブジェクトとメンバサブオブジェクトは、非ゼロのサイズを持つものとする。
注:これは私がよう-かのルールを使用して、場合、1はまだ可能性が思っていたときに、適切な
EBOがでキック持っているために、政策設計のための民間の継承を使用することにつながりますこの最適化を実行することができます。
編集:回答やコメントの数を、次の、そして私が疑問に思って何のことをより明確にします。
はまず、私は例をあげてみましょう:
struct Empty {};
struct Foo { Empty e; int i; };
私の質問は、なぜsizeof(Foo) != sizeof(int)
ですか?特に、パッキングを指定しない限り、Fooはintの2倍のサイズになる可能性があります。これは不思議なほどに膨らんでしまいます。
注:sizeof(Foo) != 0
ですなぜ私の質問は何のサブオブジェクトがゼロの大きさを持っていない可能性があるため、それが、これは実際にC++によるとEBOのいずれか
によって必要とされていない、ではありません。
struct Bar: Empty { int i; };
がそうである(EBOのおかげ)sizeof(Bar) == sizeof(int)
に従う:ただし塩基は、したがって、ゼロサイズ(EBO)を有することを許可されています。
スティーブ・ジェサップは、2つのサブオブジェクトが同じアドレスを持たないように考えられているようです。それは簡単です、
あなたは「未使用」のメモリを持っている場合:私は、しかし、それは実際にはほとんどの場合、最適化を防ぐことはできません、それについて考え
struct UnusedPadding { Empty e; Empty f; double d; int i; };
// chances are that the layout will leave some memory after int
しかし、実際には、それも「悪いことです"それよりも、Empty
スペースは書かれていないので(あなたがEBOが始動するならば...)、したがって、あなたが実際に別のオブジェクトのアドレスではありません占有場所でそれを置くことができます:
struct Virtual { virtual ~Virtual() {} Empty e; Empty f; int i; };
// most compilers will reserve some space for a virtual pointer!
か、でも私たちのオリジナルケースには:すべての私達場合
struct Foo { Empty e; int i; }; // deja vu!
一つは(char*)foo.e == (char*)foo.i + 1
を持つことができます別のアドレスが欲しかった。
Boostの[Compressed Pair](http://www.boost.org/doc/libs/1_45_0/libs/utility/compressed_pair.htm)ライブラリを見て、この最適化の方法をご覧ください。 – GManNickG
@GMan:彼らは巧みにEBOを使います。しかし、実際にこのEBOの使用はまさに私の質問から始まるものでした。 –
これを参照してください:[Empty Base Optimization(EBO)を使用するプログラマはいつですか(0120)] – Nawaz