我正在查看以下GCC源代码文件stl_tree.h:
https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.1/stl__tree_8h-source.html
特别是这一部分:
struct _Rb_tree_impl : public _Node_allocator
{
_Key_compare _M_key_compare;
_Rb_tree_node_base _M_header;
size_type _M_node_count; // Keeps track of size of tree.
我正在尝试找出_Rb_tree_impl
对象所拥有的数据成员 - 我的意思是它可能从_Node_allocator
继承的数据成员。
在第330行,它将_Node_allocator
定义为:
typedef typename _Alloc::template rebind<_Rb_tree_node<_Val> >::other _Node_allocator;
我不知道如何找到此类型的定义来检查它包含哪些数据成员。有人可以帮忙吗?这个类/结构位于何处?
答案 0 :(得分:4)
分配器是无状态的,因此它不包含任何字段。 impl
类的目的是通过使用基类布局优化不会为分配器花费任何空间。
天真的实施会浪费空间:
template <typename T, typename Alloc>
class NaiveContainer
{
Node<T*> root; // just for exposition
Alloc alloc;
public:
NaiveContainer(Alloc const & a = Alloc()) : alloc(a) {}
Alloc get_alloc() const { return alloc; }
// ...
};
这个类严格地比它需要的大。因此,更聪明的解决方案是使用私有嵌套类:
template <typename T, typename Alloc>
class EboContainer
{
struct Impl : Alloc
{
Impl(Alloc const & a) : Alloc(a) {}
Node<T*> root;
};
Impl impl;
public:
EboContainer(Alloc const & a = Alloc) : impl(a) {}
Alloc get_alloc() const { return impl; /* slicing */ }
// ...
};
现在,该类与保存相关数据成员所需的大小完全相同。顺便提一下,这个实现是切片有用时的一个例子。