vac*_*vac 8 c++ stl vector c++11
我正在阅读Generic <Programming> Typed Buffers,这是一篇来自Andrei Alexandrescu的老文章.
我想知道它是否仍然有意义.在他的文章中,Alexandrescu指出了std::vector性能至关重要时的一些问题:
std::vector::reservestd::vector类型,例如char使用std::memcpy和std::memmove.对于主流编译器来说这是不真实的(从我所看到的).std::vector通过简单的方法调用来缩小适合大小的容量.从C++ 11开始,这也是不真实的std::vector::shrink_to_fit()我的问题是,这篇文章是完全过时的,我现在可以依赖向量(如果需要包括自定义分配器)来拥有一个快速连续的缓冲区吗?
std::vectorC++11 在很大程度上缩小了与原始数组之间的差距(移动语义并shrink_to_fit解决了 Alexandrescu 的一些观点),但在某种程度上,利基市场仍然存在;std::vector继续对元素进行值初始化;reserve没有帮助,因为您无法访问保留的内存。您可以使用自定义分配器解决这个问题,但这远不能令人满意。
从另一端来看,unique_ptr<T[]>使得在容器类中保存缓冲区变得更加简单,因为它在很大程度上解决了异常安全问题。TSdynarray在构造时提供固定大小的分配并具有默认初始化,看起来可能会弥补大部分剩余的差距。
Alexandrescu 的通用缓冲区占据的剩余利基是提供具有 O(n) 收缩和增长操作的默认初始化元素;这些通常作为容器类的组件没有用处,如果需要,可以将其编写为非成员函数。