87

C++14 呈现std::dynarray

std::dynarray 是一个序列容器,它封装数组,其大小在构造时是固定的,并且在对象的整个生命周期内都不会改变。

std::dynarray必须在运行时分配,与std::vector.

那么std::dynarray我们可以使用std::vector哪个更动态(并且也可以重新调整大小)的好处和用途是什么?

4

2 回答 2

96

那么std::dynarray,当我们可以使用std::vector哪个更动态(Re-sizable)时,有什么好处和用途呢?

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

然而,主要的性能优势在于鼓励实现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++ 委员会会议上,决定std::dynarray从 C++14 中撤出,单独发布数组扩展 TS(技术规范)文档定义std::experimental::dynarray和运行时绑定数组(ARBs,类似到 C99 VLA。)这意味着std::dynarray几乎肯定不会出现在 C++14 中。

于 2013-10-01T08:39:59.227 回答
31

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

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

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

您可能还想知道为什么我们需要可变长度数组std::dynarray C++14 中的 VLA 限制性更强;它们只能是本地的、自动的变量,并且无法指定分配策略,当然它们也没有标准的容器接口。


来自“当前草案”的 23.3.4.2 中的一些示例(以 Google 缓存为例):

explicit dynarray(size_type c);

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

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

效果:相当于前面的构造函数,只是每个元素都是用 uses-allocator construction 构造的

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

模板结构 uses_allocator, Alloc> : true_type { };

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

编辑:乔纳森维克利的回答必将更具权威性和洞察力。

于 2013-10-01T08:08:05.720 回答