文章泛型<Programming>类型化缓冲区在 C++ 11 中是否完全过时?

Is the article Generic<Programming> Typed Buffers completely obsolete with C++ 11?

本文关键字:是否 过时 C++ 缓冲区 lt 泛型 Programming gt 文章 类型化      更新时间:2023-10-16

我在读《Generic Typed Buffers》,这是Andrei Alexandrescu写的一篇很老的文章。

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

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

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

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

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

Alexandrescu的泛型缓冲区占用的剩余空间是为默认初始化的元素提供O(n)的收缩和增长操作;它们通常不能作为容器类的组件使用,如果需要,可以写成非成员函数。