文章Generic <programming> Typed Buffers是否完全过时了C ++ 11?</programming>

时间:2014-07-21 14:53:29

标签: c++ c++11 vector stl

我正在阅读Generic<Programming> Typed Buffers,这是一篇来自Andrei Alexandrescu的旧文章。

我想知道它是否仍然有意义。在他的文章中,Alexandrescu在表现至关重要时指出了std::vector的一些问题:

  • 分配我认为可以使用std::vector::reserve
  • 解决的向量时不必要的数据初始化
  • 昂贵的移动操作,用C ++ 11解决并移动语义
  • 大多数编译器不会使用std::vectorcharstd::memcpy等类型优化std::memmove。对于主流编译器来说,这是不正确的(从我所看到的)。
  • 指数增长。您无法通过简单的方法调用缩小std::vector的容量以适应大小。自C ++ 11以std::vector::shrink_to_fit()
  • 以来,这也是不真实的

我的问题是,这篇文章是否完全过时,我现在可以依赖向量(如有必要,包括自定义分配器)来拥有一个快速连续的缓冲区吗?

1 个答案:

答案 0 :(得分:3)

C ++ 11在很大程度上缩小了std::vector和原始数组之间的差距(移动语义和shrink_to_fit解决了一些Alexandrescu的问题),但这个利基仍然存在一定程度; std::vector继续对元素进行初始化; reserve没有帮助,因为您无法访问保留的内存。你可以使用自定义分配器来解决这个问题,但它远非令人满意。

另一方面,unique_ptr<T[]>使容器类中的缓冲区更加直接,因为它在很大程度上解决了异常安全问题。 TS dynarray在构造时使用默认初始化提供固定大小的分配,看起来可能会关闭差距的大部分剩余部分。

Alexandrescu的通用缓冲区占据的剩余利基是提供具有O(n)收缩和增长操作的默认初始化元素;这些通常不能用作容器类的组件,如果需要,可以写成非成员函数。