在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.
显然在C99中,以下语法有效:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?
一些潜在的原因:
C++标准规定数组大小必须是常量表达式(8.3.4.1).
是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
该vector版本变得很笨拙:
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)
切片,行和列也可能遍布整个内存.
看一下comp.std.c++这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector总是更好的解决方案.
C++ 11给了我们很棒std::array,这需要在编译时知道大小:
std::array<int, 3> myarray = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)
现在,我碰巧有一些旧的short*缓冲区要包装,其大小将在运行时才知道(当然它将是).
C++ 14将定义std::dynarray为涵盖这种情况,但dynarray在GCC 4.7和Clang 3.2中尚不可用.
那么,有没有人知道一个与std::array(在效率方面)相当但不需要在编译时指定大小的容器?我怀疑Boost已经为我做好了准备,虽然我找不到任何东西.
gcc 4.9现在支持n3696(具有自动存储持续时间的运行时大小的数组).n3662说:
在具有自动存储持续时间的N3497运行时大小的数组中,Jens Maurer建议使用运行时绑定的数组.这些数组是std :: dynarray,因为普通的固定大小数组是std :: array.
在这个邮件列表中,Jonathan Wakely说:
我们应该在手册中添加一个C++ 14状态表,但同时这里是库状态的快速摘要.
...
缺少这些:
- N3672添加实用程序类以表示可选对象的提议
- N3655 TransformationTraits Redux
- N3662 C++动态数组
- N3644空前向迭代器
特征一个很简单,但有点乏味,迭代器可能只影响调试模式,但其他两个是重要的工作.是否有人打算继续工作?
但是,n3662还说:
我们建议为数组定义一个新的工具,而不是采用C可变长度数组,其中元素的数量在构造时被绑定.我们将这些动态数组称为dynarray.
我似乎无法dynarray在gcc页面上使用快速CTRL + F. 所以dynarray即将实施,并将variable length arrays留下或将消失?