繁体   English   中英

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

[英]Why both runtime-sized arrays and std::dynarray in C++14?

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中的任何内容。

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

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

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

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

有实际运行时C11大小的数组和C ++ 1Y C11式运行时尺寸的阵列,而不是其中的是运行时间之间的重要区别sizeof ,实际的运行时间C11尺寸阵列的支持。 但它的基本用途可能是兼容的。

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

正如你所说, std::dynarray将提供STL风格的界面,这使得它更加惯用。 但是,C ++需要使用new[]创建的动态数组:

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

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

通常,C ++ 14 std::dynarray和C ++ new[]数组之间的差异几乎与C ++ 11 std::array和C风格数组之间的差异相同。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM