std :: dynarray vs std :: vector

时间:2013-10-01 08:05:38

标签: c++ stdvector

C ++ 14呈现std::dynarray

  

std :: dynarray是一个用a封装数组的序列容器   在建筑中固定的尺寸,并且在整个过程中不会改变   对象的生命周期。

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

那么std::dynarray有什么好处和用法,而我们可以使用std::vector更动态(也可以重新调整大小)?

2 个答案:

答案 0 :(得分:79)

  

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

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

然而,主要的性能优势是为了鼓励实现尽可能在堆栈上分配dynarray,避免任何堆分配。 e.g。

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(技术规范)文档,定义{{1}和运行时绑定的数组(ARB,类似于C99 VLA。)这意味着std::experimental::dynarray几乎肯定不会在C ++ 14中。

答案 1 :(得分: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构造

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

  

模板      struct uses_allocator,Alloc&gt; :true_type {};

     

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

编辑:Jonathan Wakely的答案肯定会更具权威性和洞察力。