C++ 文章是否通用<;编程>;类型化缓冲区与C+完全过时+;11?

C++ 文章是否通用<;编程>;类型化缓冲区与C+完全过时+;11?,c++,c++11,vector,stl,C++,C++11,Vector,Stl,我在读安德烈·亚历山德雷斯库的一篇相当古老的文章 我想知道这是否还有意义。Alexandrescu在他的文章中指出了当性能至关重要时std::vector的一些问题: 分配向量时不必要的数据初始化,我认为可以使用std::vector::reserve 用C++11和move语义解决昂贵的move操作 大多数编译器不会使用std::memcpy和std::memmove对char等类型进行优化。对于主流编译器来说,这是不真实的(从我所看到的情况来看) 指数增长。您不能通过一个简单的方法调用来缩

我在读安德烈·亚历山德雷斯库的一篇相当古老的文章

我想知道这是否还有意义。Alexandrescu在他的文章中指出了当性能至关重要时
std::vector
的一些问题:

  • 分配向量时不必要的数据初始化,我认为可以使用
    std::vector::reserve
  • 用C++11和move语义解决昂贵的move操作
  • 大多数编译器不会使用
    std::memcpy
    std::memmove
    char
    等类型进行优化。对于主流编译器来说,这是不真实的(从我所看到的情况来看)
  • 指数增长。您不能通过一个简单的方法调用来缩小std::vector的容量以适应大小。这也是不正确的,因为C++11带有
    std::vector::shrink\u to_fit()

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

C++11很大程度上缩小了
std::vector
和原始数组之间的差距(移动语义和
收缩以适应
解决了Alexandrescu的一些问题),但生态位在一定程度上仍然存在<代码>标准::向量继续初始化元素的值<代码>保留没有帮助,因为您无法访问保留内存。您可以使用自定义分配器来解决这个问题,但这远远不能令人满意

另一方面,
unique\u ptr
使在容器类中保存缓冲区变得更加简单,因为它在很大程度上解决了异常安全问题。TS在构建时提供固定大小的分配,并带有默认初始化,看起来很可能会缩小剩余的差距


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

最后一点是不正确的:
shrink\u to\u fit
只能通过将数据复制到一个新的较小的块来收缩。第一点,您是指初始化还是分配?谢谢,我将编辑这个问题,我的意思是“收缩到适合”是集成的,用户不得进行不必要的复制当然,内部复制是制作的。您不能使用
保留
,然后将数据传递给C函数(这就是本文讨论的初始化)。您必须调用
resize
,这确实会初始化数据。@juanchopanza
shrink\u to\u fit
可以使用分配器内部的知识来执行某些操作,而不是将数据复制到新块。例如,如果分配器使用
malloc
/
free
来获取内存块
shorn\u to\u fit
可以使用
realloc
实现,如果(a)类型
是可构造的
或(b)当被要求收缩块时,
realloc
实现从未在内存中重新定位。我不明白你为什么说不可能访问保留内存。我尝试使用
reserve()
然后使用
data()
,然后使用
memcpy
将此数据复制到分配的
int*
,结果似乎有效。我想我失踪了something@vac“它似乎起作用”是一个无关的观察,当涉及到。