为什么在C ++ 14中运行时大小的数组和std :: dynarray?
Draft C ++ 14包含运行时大小的数组和std::dynarray
容器。 从我可以告诉,两者之间唯一真正的区别是std::dynarray
有一个STL接口(例如, begin
, end
, size
等),而运行时大小的数组不。 那么为什么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数组:
- 至less实现
std::dynarray
(所以你不能没有新的[] dynarray] - 保持与以前版本的兼容性
你不能只是说所有使用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标准。