【发布时间】:2014-09-12 03:24:18
【问题描述】:
我正在阅读 Generic<Programming> Typed Buffers,来自 Andrei Alexandrescu 的一篇相当古老的文章。
我想知道它是否仍然有意义。 Alexandrescu 在他的文章中指出了std::vector 在性能至关重要时的一些问题:
- 分配向量时不必要的数据初始化,我认为可以使用
std::vector::reserve解决 - 用 C++11 和移动语义解决的昂贵的移动操作
- 大多数编译器不会使用
std::memcpy和std::memmove为char等类型优化std::vector。现在对于主流编译器来说这是不正确的(据我所见)。 - 指数增长。您不能通过简单的方法调用来缩小
std::vector的容量以适应大小。这也是不正确的,因为 C++11 和std::vector::shrink_to_fit()
我的问题是,这篇文章是否完全过时了,我现在可以依靠向量(包括必要时的自定义分配器)来获得快速连续缓冲区吗?
【问题讨论】:
-
最后一点不正确:
shrink_to_fit只能通过将数据复制到一个新的、更小的块中来进行收缩。 -
第一点,你是说初始化还是分配?
-
谢谢我会编辑这个问题,我的意思是shrink_to_fit是集成的,用户不能做不必要的副本,当然内部副本是制作的
-
您不能使用
reserve然后将数据传递给 C 函数(这就是本文所讨论的有关初始化的内容)。您必须调用resize,这确实会初始化数据。 -
@juanchopanza
shrink_to_fit可以使用分配器内部的知识来做一些事情,而不是将数据复制到新块。例如,如果分配器使用malloc/free获取内存块shrink_to_fit可以用realloc实现,如果(a)is_trivially_move_constructible类型或(b)realloc实现已知当被要求缩小块时,永远不要在内存中重定位。