Warm tip: This article is reproduced from serverfault.com, please click

其他-为什么可变长度数组不是C ++标准的一部分?

(其他 - Why aren't variable-length arrays part of the C++ standard?)

发布于 2009-12-11 10:15:40

在过去的几年中,我很少使用C。今天,当我阅读此问题时,遇到了一些我不熟悉的C语法。

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

void foo(int n) {
    int values[n]; //Declare a variable length array
}

这似乎是一个非常有用的功能。是否有关于将其添加到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
}

vector版本变得很笨拙:

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values( /* Really painful expression here. */);
}

切片,行和列也可能会散布到整个内存中。

纵观讨论,comp.std.c++很明显,这个问题在论证两边都带有一些非常重量级的名字,这引起了很大的争议。当然,std::vector总是可以找到更好的解决方案。

Questioner
Andreas Brinck
Viewed
0
174 2015-09-03 05:11:04

最近在usenet中开始了对此的讨论:为什么C ++ 0x中没有VLA

我同意那些似乎同意必须在堆栈上创建潜在的大型阵列(通常只有很少的可用空间)的做法不好的人。该参数是,如果你事先知道大小,则可以使用静态数组。而且,如果你事先不知道大小,你将编写不安全的代码。

C99 VLA可以带来一个小的好处,即能够创建小型数组而不会浪费空间或为未使用的元素调用构造函数,但是它们会给类型系统带来相当大的变化(你需要能够根据运行时值指定类型-这除了new运算符类型说明符外,当前C ++中尚不存在该表达式,但对它们进行了特殊处理,因此运行时不会逃脱new运算符的范围)。

你可以使用std::vector,但它并不完全相同,因为它使用动态内存,并且使其使用自己的堆栈分配器并不是一件容易的事(对齐也是一个问题)。它也不能解决相同的问题,因为向量是可调整大小的容器,而VLA是固定大小的。C ++动态阵列提议旨在介绍文库的基于溶液,作为替代基于VLA的语言。但是,据我所知,它不会成为C ++ 0x的一部分。