std::dynarray vs std::vector
std::dynarray vs std::vector
C++14 提供std::dynarray
:
std::d ynarray 是一个序列容器,它用 在施工时固定且在整个过程中不会改变的尺寸 对象的生存期。
std::dynarray
必须在运行时分配,与 std::vector
相同。
那么,std::dynarray
的好处和用法是什么,而我们可以使用std::vector
更动态(并且还可以重新调整大小(?
那么
std::dynarray
的好处和用法是什么,当我们可以使用std::vector
更动态(可重新调整大小(时?
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++委员会会议上决定从 C++14 中提取std::dynarray
,并发布单独的阵列扩展 TS(技术规范(文档,定义运行时绑定的std::experimental::dynarray
和数组(ARB,类似于 C99 VLA(。 这意味着std::dynarray
几乎肯定不会出现在C++14中。
正如你自己所说,std::dynarray
适用于固定大小的动态数组。它不可调整大小。粗略地说,这是对new T[N]
和std::unique_ptr<T[]>(new T[N])
的改进。
无需调整容量大小或管理容量意味着您可以以更低的复杂性和更少的空间实施数据结构。
此外,std::dynarray
是一种奇怪的动物,它允许实现以不同的、非特定的方式实现它,例如,可以将数组放在堆栈上。调用分配函数是"可选的"。您可以指定一个分配器来构造数组的元素,但这不是类型的一部分。
您可能还想知道为什么我们需要std::dynarray
和可变长度数组。C++14 中的 VLA 限制性要强得多;它们只能是局部的自动变量,不提供指定分配策略的方法,当然它们没有标准的容器接口。
"当前草稿"的 23.3.4.2 中的一些示例(以谷歌缓存为例(:
explicit dynarray(size_type c);
效果:为
c
元素分配存储空间。可能会也可能不会调用全局operator new
。
template <class Alloc> dynarray(size_type c, const Alloc& alloc);
效果:等效于前面的构造函数,只是每个元素都是使用 uses-分配器构造构造的。
是否可以使用给定的分配器来构造数组元素是一个全局特征:
模板 struct uses_allocator, Alloc> : true_type { };
要求:
Alloc
应是分配器(17.6.3.5(。[注意:此特征的专用化通知其他库组件,可以使用分配器构造dynarray
,即使它没有嵌套allocator_type。
编辑:乔纳森·韦克利(Jonathan Wakely(的回答注定会更加权威和有见地。
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?