我正在阅读Generic<Programming> Typed Buffers,这是一篇来自Andrei Alexandrescu的旧文章。
我想知道它是否仍然有意义。在他的文章中,Alexandrescu在表现至关重要时指出了std::vector
的一些问题:
std::vector::reserve
std::vector
和char
为std::memcpy
等类型优化std::memmove
。对于主流编译器来说,这是不正确的(从我所看到的)。std::vector
的容量以适应大小。自C ++ 11以std::vector::shrink_to_fit()
我的问题是,这篇文章是否完全过时,我现在可以依赖向量(如有必要,包括自定义分配器)来拥有一个快速连续的缓冲区吗?
答案 0 :(得分:3)
C ++ 11在很大程度上缩小了std::vector
和原始数组之间的差距(移动语义和shrink_to_fit
解决了一些Alexandrescu的问题),但这个利基仍然存在一定程度; std::vector
继续对元素进行初始化; reserve
没有帮助,因为您无法访问保留的内存。你可以使用自定义分配器来解决这个问题,但它远非令人满意。
另一方面,unique_ptr<T[]>
使容器类中的缓冲区更加直接,因为它在很大程度上解决了异常安全问题。 TS dynarray
在构造时使用默认初始化提供固定大小的分配,看起来可能会关闭差距的大部分剩余部分。
Alexandrescu的通用缓冲区占据的剩余利基是提供具有O(n)收缩和增长操作的默认初始化元素;这些通常不能用作容器类的组件,如果需要,可以写成非成员函数。