C ++ 14呈现std::dynarray
:
std :: dynarray是一个用a封装数组的序列容器 在建筑中固定的尺寸,并且在整个过程中不会改变 对象的生命周期。
std::dynarray
必须在运行时分配,与std::vector
相同。
那么std::dynarray
有什么好处和用法,而我们可以使用std::vector
更动态(也可以重新调整大小)?
答案 0 :(得分:79)
那么,当我们可以使用更具动态性(可重新调整大小)的
std::dynarray
时,std::vector
有什么好处和用途?
dynarray
比vector
更小更简单,因为它不需要管理单独的大小和容量值,也不需要存储分配器。
然而,主要的性能优势是为了鼓励实现尽可能在堆栈上分配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的答案肯定会更具权威性和洞察力。