「空のメンバー」の 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
ポインタを含める必要がある(または有益な)のはなぜですか? これは、クラスのインターフェイスをカプセル化することに関連していますか?P
list<>
head_.p
p
list<>
Alloc
Node
インターフェイスをカプセル化するネストされたクラスに、最上位クラスではなくへのポインタがあるのはなぜですか?