相关疑难解决方法(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万
查看次数

为什么C++不支持堆栈上的动态数组?

在C99这是合法的:

void f(size_t sz) {
    char arr[sz];
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,这个 - 动态大小的堆栈数组 - 已经在C++中被删除了,而没有在C++ 11中看到返回.

AFAIK C++是在考虑到C兼容性的情况下制作的,所以我想知道必须有一些非常好的论据,不包括这个有用的功能,对吗?

我能想到的就是:

优点

  • 允许更智能的阵列大小需要在堆栈上(临时缓冲区?),从而节省内存.
  • 减少"智能指针"(或更糟糕的是,手动错误引入delete [])和慢堆分配.
  • 与C99的兼容性.

缺点

  • 允许人们在堆栈上轻松分配过大的数组,从而产生难以调试的堆栈溢出.
  • 编译器编写者更复杂.

那么,为什么他们在导入其他C99功能时没有包含它?


为了防止这种情况被关闭为"主观"或"不具有建设性",我正在寻找来自委员会成员的引用或者讨论谈论此事的讨论的链接 - 当然还有快速的SO综述的奖励积分.

而不是将其视为小马与仓鼠的讨论,将其视为一个历史问题,仅仅关注所考虑的优势和劣势(如果有的话).


编辑:正如James McNellis在下面的评论中所指出的,C++标准化可变长度数组之前存在C++.你可能会把我的问题读作:" 为什么没有,他们不会添加它? ".

c++ standards stack dynamic-arrays

30
推荐指数
1
解决办法
6865
查看次数

有没有办法用非常量变量初始化数组?(C++)

我正在尝试创建一个类:

class CLASS
{
public:
    //stuff
private:
    int x, y;
    char array[x][y];
};
Run Code Online (Sandbox Code Playgroud)

当然,直到我换int x, y;到它才行

const static int x = 10, y = 10;
Run Code Online (Sandbox Code Playgroud)

这是不切实际的,因为我试图从文件中读取x和y的值.那么有没有办法初始化一个具有非常量值的数组,或者声明一个数组并在不同的语句中声明它的大小?我知道这可能需要创建一个数组类,但是我不知道从哪里开始,我不想在数组本身不是动态的时候创建一个2D动态列表,只是大小是在编译时不知道.

c++ arrays

11
推荐指数
2
解决办法
3万
查看次数