std::dynarray vs std::vector

std::dynarray vs std::vector

本文关键字:std vector dynarray vs      更新时间:2023-10-16

C++14 提供std::dynarray

std::d ynarray 是一个序列容器,它用 在施工时固定且在整个过程中不会改变的尺寸 对象的生存期。

std::dynarray必须在运行时分配,与 std::vector 相同。

那么,std::dynarray的好处和用法是什么,而我们可以使用std::vector更动态(并且还可以重新调整大小(?

那么std::dynarray的好处和用法是什么,当我们可以使用std::vector更动态(可重新调整大小(时?

dynarrayvector更小更简单,因为它不需要管理单独的大小和容量值,也不需要存储分配器。

然而,主要的性能优势来自于这样一个事实,即鼓励实现尽可能在堆栈上分配dynarray,避免任何堆分配。

例如
std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

这种优化需要编译器的合作,它不能作为纯库类型实现,并且必要的编译器魔术尚未实现,没有人确定它有多容易做到。由于缺乏实施经验,上周在芝加哥举行的C++委员会会议上决定从 C++14 中提取std::dynarray,并发布单独的阵列扩展 TS(技术规范(文档,定义运行时绑定的std::experimental::dynarray和数组(ARB,类似于 C99 VLA(。 这意味着std::dynarray几乎肯定不会出现在C++14中。

正如你自己所说,std::dynarray适用于固定大小的动态数组。它不可调整大小。粗略地说,这是对new T[N]std::unique_ptr<T[]>(new T[N])的改进。

无需调整容量大小或管理容量意味着您可以以更低的复杂性和更少的空间实施数据结构。

此外,std::dynarray是一种奇怪的动物,它允许实现以不同的、非特定的方式实现它,例如,可以将数组放在堆栈上。调用分配函数是"可选的"。您可以指定一个分配器来构造数组的元素,但这不是类型的一部分。

您可能还想知道为什么我们需要std::dynarray可变长度数组。C++14 中的 VLA 限制性要强得多;它们只能是局部的自动变量,不提供指定分配策略的方法,当然它们没有标准的容器接口。


"当前草稿"的 23.3.4.2 中的一些示例(以谷歌缓存为例(:

explicit dynarray(size_type c);

效果:c元素分配存储空间。可能会也可能不会调用全局operator new

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

效果:等效于前面的构造函数,只是每个元素都是使用 uses-分配器构造构造的。

是否可以使用给定的分配器来构造数组元素是一个全局特征:

模板 struct uses_allocator, Alloc> : true_type { };

要求:Alloc应是分配器(17.6.3.5(。[注意:此特征的专用化通知其他库组件,可以使用分配器构造dynarray,即使它没有嵌套allocator_type。

编辑:乔纳森·韦克利(Jonathan Wakely(的回答注定会更加权威和有见地。