为什么在C ++ 14中运行时大小的数组和std :: dynarray?

Draft C ++ 14包含运行时大小的数组和std::dynarray容器。 从我可以告诉,两者之间唯一真正的区别是std::dynarray有一个STL接口(例如, beginendsize等),而运行时大小的数组不。 那么为什么C ++ 14需要它们呢?

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

那么,为什么C ++ 14需要运行时大小的数组和std::dynarray呢? 考虑到std::dynarray有一个更丰富的(STLified)接口,为什么不删除运行时大小的数组,假设std::dynarray可以实现相同的运行效率?

澄清

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

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

N2648表示,为了与C ++实践保持一致, std::dynarray可用于多个自动variables。 但为了利用效率堆栈分配,我们希望在用作自动variables时使dynarray优化。

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

C11风格的运行时大小的数组仍然是一个有用的语法,而增加与C的dynarray的代价并不高:无论如何,这个机制必须被实现为高效的自动dynarray 。 另外,C11风格运行时大小的数组是一等公民,并且不pipe程序员使用std库如何。

实际的C11运行时大小的数组和C ++ 1y C11风格的运行时大小的数组之间存在着重要的差异,而不是实际的C11运行时大小的数组所支持的运行时大小。 但是它的基本使用可能是兼容的。

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

我想你自己回答了这个问题, std::dynarray有stl接口。 c + + 11的目标,我假设c + + 14是使c + +更易于用户,更less的错误,更容易为初学者。 使用C风格的数组可能会遇到指针算术问题,但是dynarray可以避免这些问题
编辑:所以它看起来像一个区别是运行时大小的数组必须在堆栈上分配,增加堆栈溢出的可能性。 dynarray被分配在堆上,尽pipe可以在栈上分配(如果实现这样做的话)

正如你所说你自己std::dynarray将提供STL风格的界面,这使得它更习惯使用。 尽pipe如此,C ++还是需要使用new[]来创builddynamic数组:

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

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

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

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