相关疑难解决方法(0)

为什么变长数组不是C++标准的一部分?

在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.

显然在C99中,以下语法有效:

void foo(int n) {
    int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?

一些潜在的原因:

  • 毛茸茸的编译器供应商实现
  • 与标准的其他部分不兼容
  • 可以使用其他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++ arrays standards variable-length variable-length-array

311
推荐指数
7
解决办法
14万
查看次数

目前有什么替代std :: dynarray吗?

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已经为我做好了准备,虽然我找不到任何东西.

c++ c++11 c++14

15
推荐指数
3
解决办法
4429
查看次数

dynarrays的状态是什么?

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.

我似乎无法dynarraygcc页面上使用快速CTRL + F. 所以dynarray即将实施,并将variable length arrays留下或将消失?

c++ dynamic-arrays dynarray c++14

6
推荐指数
1
解决办法
1437
查看次数