首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::dynarray vs std::载体

std::dynarray vs std::载体
EN

Stack Overflow用户
提问于 2013-10-01 08:05:37
回答 2查看 20.3K关注 0票数 89

C++14呈现std::dynarray

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

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

那么,std::dynarray的好处和用法是什么,而我们可以使用更动态(也更大)的std::vector呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-01 08:39:59

那么,当我们可以使用更具动态性(可重量化)的std::dynarray时,std::vector的好处和用法是什么呢?

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

但是,主要的性能好处在于鼓励实现在可能的情况下在堆栈上分配dynarray,从而避免任何堆分配。例如:

代码语言:javascript
复制
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中。

票数 97
EN

Stack Overflow用户

发布于 2013-10-01 08:08:05

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

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

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

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

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

外显张力障碍(Size_type c); 效果:为c元素分配存储空间。可能不会调用全局operator new**.** ()。

模板染料(size_type c,const & alloc); 效果:等效于前面的构造函数,除了,每个元素都是用uses构造构造的。

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

模板结构uses_allocator,Alloc>:true_type { }; 要求:Alloc应是分配器(17.6.3.5)。注意:这个特性的专门化告诉其他库组件,dynarray可以使用分配器构建,即使它没有嵌套的allocator_type。

编辑: Jonathan的答案肯定会更加权威和有洞察力。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19111028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档