GCC implementation of std::vector
类似于以下代码:
#include <memory>
template<
typename T,
typename Allocator
> struct vector_base {
using T_alloc = typename std::allocator_traits<Allocator>::template rebind_alloc<T>;
using pointer = typename std::allocator_traits<T_alloc>::pointer;
struct vector_imp
: public T_alloc {
pointer m_start;
pointer m_finish;
pointer m_end_of_storage;
vector_imp()
: m_start(), m_finish(), m_end_of_storage() { }
vector_imp(const T_alloc& a)
: T_alloc(a), m_start(), m_finish(), m_end_of_storage() { }
// move constructor and swap defined here...
};
vector_imp m_imp; // the sole member of vector_base
// methods for allocating/deallocating and creating storage;
// destructor.
};
// this class is the "actual" std::vector which you instantiate via
// std::vector<T> x;
template<
typename T,
typename Allocator = std::allocator<T>
> class vector
: protected vector_base<T, Allocator> {
// all the interface is implemented in terms of calls to vector_imp;
// this class has no members (except, of course, from the member of
// vector_base<T, Allocator>)
};
本质上,API是根据基类和实现类实现的。实现类包含三个必不可少的成员:存储开始,数据结束和存储结束。
我理解为什么vector_imp
派生自T_alloc
:空基优化将确保无状态分配器不会占用std::vector
中的任何空格。
但是,我不明白为什么vector
使用vector_base
的受保护继承。我本来以为它是私有继承:没有人需要知道vector<T, A>
以 vector_base<T, A>
实现,甚至不是vector<T, A>
派生的类,因为它并不意味着是子类。
您能为这种设计选择提供解释吗?
答案 0 :(得分:2)
我怀疑对此有任何合理的解释。这个受保护的继承可以追溯到最初的SGI STL实现 - 可以说是第一个实现?可能会回来,而不是有人认为毕竟会有继承传统的classess,可能是库中包含的那些。
它没有发生(据我所知,至少 - 在stdcxx标准库实现中没有vector的后代),但可能没有人对更改这个继承说明符感兴趣。