teppy「空のクラス」を定義します。classという意味ではありませんよ。classという意味です。メンバ変数を持たず継承もしていない、とにかくデータとしての要素の無いクラスです。EmptyClass{};このEmptyClassのサイズはいくつでしょうか?Emptyという位なのでゼロなのかと思いきや、sizeofで計るとゼロ以外の数値になります。Wandboxで見てみましょう。?その答えはある名曲に隠されています。言葉はいつも奥の方から後ろに虚しさ連れて教えてくれたけれどこんなにもからっぽになったのに僕は歩き出した__ゆず「からっぽ」からっぽに見えても、みんな何かを抱えて生きているのです。ゼロなんてありえないんですね。C++のクラスも同じなんですね。納得感を得たところで、改めて言うと、C++の型は全くデータメンバが無い状態でも単独でインスタンスが作られる場合必ずサイズを持ちます。C++のテクニカルな理由で、「空のクラス」でも、「独立したオブジェクト」のサイズは0にできないのです。「テクニカルな理由」というのは、インスタンス化された際にオブジェクトのアドレスをとれるようにする為です。サイズ0ではアドレスが決まりませんからね。このようにc++では単独でインスタンス化されるオブジェクトは例外なくサイズを持ちます。メンバ変数の一部として定義された場合もサイズを持ちます。e;};この場合でも&Hoge::eを決めなければいけないのでeはサイズを持ちます。1byteとはいえ無駄なメモリを消費することになります。コピー禁止をmix-inするboost::noncpyable等はまさにメンバを持たない空のクラスですね。コピー禁止するたびにデータサイズが増加したらたまったものではありません。そんなわけで、規格では、空の型が別の型を継承していて、継承元の型が既にサイズを持っている場合や、逆に空の型の継承先がサイズを持っている場合はEmptyClass自体の追加のサイズは無くしても良いことになっています。Optimization)と言います。EBOの効かないコンパイラなんてほとんどありませんが、場合によっては型サイズの肥大化やアライメントのズレの原因になるので注意する必要があります。EBOを意識した実装コンパイラが空のクラスを最適化してくれることは理解しました。プログラマもEBOが効くコードを意識して書きましょう。先のboost::noncopyableも空のクラスでしたが、他にも空のクラスを定義するシチュエーションは数多くあります。ファンクタなんかも、往々にしてoperator()だけ定義して、メンバ変数も特に無いというケースがあるかと思います。スマートポインタのデリータやコンテナのアロケータを渡して実装を決めるテンプレートクラスもEBOを意識した設計にすることでメモリ効率が上がります。以下が一例になります。オリジナルのコンテナクラスにテンプレートパラメータとしてアロケータを渡す実装で考えてみましょう。それを示すにはこの余白は狭すぎる。よってallocateメソッド以外のあらゆる定義を省くことにした。それを示すにはこの余白は狭すぎる。よってallocateメソッド以外のあらゆる定義を省くことにした。};まずはEBOを意識しない設計。以下コンテナとしての必要条件を満たす色々な機能の定義が続く...};普通にAllocatorをメンバとして持っています。続いてEBOを意識した設計。Allocatorを継承した設計になっています。以下コンテナとしての必要条件を満たす色々な機能の定義が続く...};サイズを計ってみましょう。16このようにちょっと意識することでメモリ効率の良いクラス設計ができるようになります。