c++ - STL vector 的实现

标签 c++ c++11 vector stl

我想知道 STL 怎么样 std::vector实现。

确切地说,STL vector 中保存的是对象表还是对象指针表?

在实际实现中:std::vector<char> 是否更好?大小约为 10^8 , 或者有一个 char 的数组?

第一个选项有明显的优点:像在所有其他容器中一样进行迭代、已知大小、自动内存管理、很难做真正错误的事情。

第二个选项可能使用的空间少九倍(指针是 64 位,其中 char 是 8 位),但代价是上面列出的所有这些舒适的方法。

我看过 /usr/include/c++/4.8.2/bits/STL_vector.h 看到了push_back()实现如下,但即使检查 alloc_traits.h 也让我不知道它是如何真正完成的。

输入 char仅用于表明指针的大小与保存的值大小相比很重要。

我正在使用 C++11。

void
push_back(const value_type& __x)
{
     if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
     {
         _Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
                                  __x);
         ++this->_M_impl._M_finish;
     }
     else
#if __cplusplus >= 201103L
     _M_emplace_back_aux(__x);
#else
     _M_insert_aux(end(), __x);
#endif
}

最佳答案

vector 管理单个连续的对象数组,因此它不需要指向每个元素的指针。它只需要:

  • 指向数组开头的指针
  • 一个指针(或索引),标记所用元素的结尾(即大小)
  • 标记已分配存储(即容量)结束的指针(或索引)

(它还需要存储一个分配器;但通常,这是无状态的,并且体面的实现将使用“空基类优化”来确保它在这种情况下不占用空间)。

如果您管理自己的动态数组,则至少需要其中两个;所以使用 vector 的额外成本是单个指针。

如果您不需要动态分配,那么自动数组(或 std::array,如果您想要更多 STLy)会更高效:它不会涉及任何堆分配,或任何额外的存储空间。但是,这只有在编译时已知大小的情况下才有可能,并且存在大数组可能溢出堆栈的危险。

关于c++ - STL vector 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547873/

相关文章:

c++ - 将 uin32_t 写入 asio::streambuf

c++ - 在 C++ 中循环遍历字符串 vector 的字符串元素中的所有字符

vector - 为什么我得到的是列表而不是向量?

c++ - 如何确定 boost async_accept 是否正在监听端口

c++ - 在 Qml 代码中编辑 C++ QList<Object*> 模型的问题和一些 Qml 警告

c++ - 模板化运算符 ==

c++ - 尝试使用初始化列表构造 `std::vector` 的问题

c++ - 表达模板化数字文字的最佳方式是什么?

c++ - 未优化的 clang++ 代码在普通的 main() 中生成不需要的 "movl $0, -4(%rbp)"

c++ - 使用 C++ 异常的内存泄漏