「空のメンバー」の C++ 最適化は、次のコード スニペットです。
// Listing 4: A Better Way to Eliminate Bloat
template <class T, class Alloc = allocator<T> >
class list {
. . .
struct Node { . . . };
struct P : public Alloc {
P(Alloc const& a) : Alloc(a), p(0) { }
Node* p; // Why also encapsulate a Node pointer?
};
P head_;
public:
explicit list(Alloc const& a = Alloc())
: head_(a) { . . . }
. . .
};
この実装の主な目的は、Alloc(デフォルト クラスのように) クラスにデータ メンバーがない場合のオブジェクトの肥大化を回避することですallocatorが、この特定の実装の重要な注目すべき利点は、(任意の)Allocクラスとlistクラスのメンバー。
コード スニペットの下のコメントには、次のように要約されています。
これで、list<> メンバーは「head_.allocate()」と言ってストレージを取得し、「head_.p」と言って最初のリスト要素に言及します。これは完全に機能し、不必要なオーバーヘッドは一切なく、list<> のユーザーには違いがわかりません。
このコメントの最初の部分、つまり、メンバーがストレージを取得するために呼び出す必要があるPクラス内のインターフェイスのカプセル化を理解しています。list<>head_.allocate()
しかし、私はこのコメントの2番目の部分を理解していません.クラスにNodeポインタを含める必要がある(または有益な)のはなぜですか? これは、クラスのインターフェイスをカプセル化することに関連していますか?Plist<>head_.pplist<>Alloc
Nodeインターフェイスをカプセル化するネストされたクラスに、最上位クラスではなくへのポインタがあるのはなぜですか?