在The "Empty Member" C++ Optimization是下面的代碼片斷:爲什麼分配器接口封裝的「列表」實現的嵌套類也受益於封裝節點?
// 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
類),但是一個重要的注意此特定實施的好處是可以防止(任意的)類別和list
類別的成員之間的潛在名稱衝突。
的代碼片段下方的註釋通過陳述總結了以下幾點:
現在,名單<>成員說「head_.allocate()」獲得存儲和 說提第一個列表元素「head_.p」。這工作 完美,沒有任何不必要的開銷,並且 列表<>的用戶無法區分差異。
我明白這個評論的第一部分,即P
類中的接口封裝,使list<>
成員必須調用head_.allocate()
獲得存儲。
不過,我不明白這個評論的第二部分 - 爲什麼它是必要的(或有益),包括在P
類Node
指針,以便list<>
成員說head_.p
(而不是僅僅有提第一個列表元素p
直接成爲list<>
的成員)?這與封裝Alloc
類的接口有關嗎?
爲什麼接口封裝嵌套類具有指向Node
而不是頂級類的指針?