45

C++14 草案包括运行时大小的数组和std::dynarray容器。据我所知,两者之间唯一真正的区别是std::dynarray具有 STL 接口(例如 、、begin等),而运行时大小的数组则没有。那么为什么 C++14 两者都需要呢?endsize

我知道运行时大小的数组是核心语言的std::dynarray一部分,同时是标准库的一部分,但提案std::dynarray清楚地表明作者希望编译器在许多情况下提供特殊支持,std::dynarray以便它可以同样高效尽可能,即与运行时大小的数组一样高效。因此,语言/库的区别似乎有些人为。

那么,为什么 C++14 既需要运行时大小的数组又需要std::dynarray? 鉴于它std::dynarray具有更丰富的(STLified)接口,为什么不直接删除运行时大小的数组,假设std::dynarray可以以相同的运行时效率实现呢?

澄清

当我谈论“运行时大小的数组”时,我指的是N3639中描述的新的 C++14 核心语言功能,而不是传统的 C 数组或 VLA 或 C++11 中的任何内容。

4

3 回答 3

32

N3639建议在 C++ 中添加具有自动存储持续时间的本地运行时大小的数组。

N2648表示,根据 C++ 实践,std::dynarrays 不仅可用于自动变量。但是为了利用效率堆栈分配,我们希望dynarray在用作自动变量时进行优化。

简而言之,C11 样式运行时大小的数组仅限于存储在堆栈中。 dynarray不是,但可以在存储在堆栈上时进行优化,使其与 C11 样式运行时大小的数组一样高效(或者目标是这样)。

C11 风格的运行时大小的数组仍然是一种有用的语法,并且增加与 C 的互编译性的成本并不高:dynarray无论如何,必须实现该机制以实现高效的自动。此外,C11 风格的运行时大小的数组是一等公民,无论std程序员使用库如何都存在。

实际的 C11 运行时大小的数组和 C++1y C11 样式的运行时大小的数组之间存在重要差异,其中最重要的是sizeof实际 C11 运行时大小的数组支持的运行时。但它的基本使用可能是兼容的。

请注意,最后,在 C++14 中都没有添加。

于 2013-06-27T22:12:51.920 回答
2

正如您所说,您自己std::dynarray将提供 STL 风格的界面,这使得使用起来更加地道。尽管如此,C++ 仍需要使用以下方法创建动态数组new[]

  1. 至少实现std::dynarray(所以你不能没有新的[] dynarray)
  2. 保持与以前版本的兼容性

您不能只说所有使用 new[] 的代码现在都是错误的。

一般来说,C++14std::dynarray和 C++数组之间的区别与 C++11和 C 样式数组new[]之间的区别几乎相同。std::array

UPD:现在我看到您现在正在询问类似于 C11(VLA)的功能。实际上与它无关 - VLA 非常有限,您只能使用函数的参数作为数组大小。此外,内存是在堆栈上分配的,但std::dynarray内存是在堆中分配的。基本上,这个特性只是稍微扩展了 C 风格的数组,并使 C++ 与现代 C 标准更加兼容。

于 2013-06-27T22:01:21.570 回答
2

我想你自己回答了这个问题,std::dynarray有 stl 界面。c++11 的目标,我假设 c++14 是让 c++ 对用户更友好,更不容易出错,并且对初学者来说更容易。使用 c 样式的数组,您可能会遇到指针算术问题,但dynarray 如果按预期使用可以避免这些问题
编辑:所以看起来一个区别是运行时大小的数组必须在堆栈上分配,从而增加堆栈溢出的可能性。dynarray尽管可以在堆栈上分配,但在堆上分配(如果实现这样做)

于 2013-06-27T22:01:54.427 回答