在“空成员”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()
才能获取存储。
但是,我不理解此评论的第二部分 - 为什么有必要(或有益)Node
在类中包含一个指针,P
以便成员通过说(而不是直接成为成员)来list<>
提及第一个列表元素?这与封装类的接口有关吗?head_.p
p
list<>
Alloc
为什么封装接口的嵌套类有一个指向 a 的指针Node
,而不是顶级类?