使用C++ 11的文章Generic <Programming> Typed Buffers完全过时了吗?

vac*_*vac 8 c++ stl vector c++11

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

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

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

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

eca*_*mur 3

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

从另一端来看,unique_ptr<T[]>使得在容器类中保存缓冲区变得更加简单,因为它在很大程度上解决了异常安全问题。TSdynarray在构造时提供固定大小的分配并具有默认初始化,看起来可能会弥补大部分剩余的差距。

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

  • @vac“似乎有效”对于[未定义的行为](http://www.catb.org/jargon/html/N/nasal-demons.html)来说是一个无关紧要的观察。 (6认同)