std :: dynarray vs std :: vector

C ++ 14提供了std::dynarray

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

std::dynarray必须在运行时分配为std::vector

那么, std::dynarray的好处和用法是std::dynarray而我们可以使用更dynamic(也可重定义)的std::vector

那么,当我们可以使用更dynamic的std::vector (Re-sizable)的时候, std::dynarray有什么好处和用法呢?

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

然而,主要的性能优势是来自这样的事实,即鼓励实现在可能的情况下在堆栈上分配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 

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

正如你所说, std::dynarray是一个固定大小的dynamic数组。 它不可resize。 这大致上是对new T[N]std::unique_ptr<T[]>(new T[N])

不需要resize或pipe理容量意味着您可以以更less的复杂性和更less的空间来实现数据结构。

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

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


“当前草案”(采用Googlecaching)的23.3.4.2中的一些示例:

 explicit dynarray(size_type c); 

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

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

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

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

template struct uses_allocator,Alloc>:true_type {};

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

编辑:乔纳森·沃克利的答案肯定会更具权威性和洞察力。