【问题标题】:Why does C++ allow variable length arrays that aren't dynamically allocated?为什么 C++ 允许非动态分配的可变长度数组?
【发布时间】:2011-02-06 07:34:58
【问题描述】:

我对 C++ 比较陌生,从一开始我就深知你不能做类似的事情

int x;
cin >> x;
int array[x];

相反,您必须使用动态内存。然而,我最近发现上面的 编译(虽然我得到一个 -pedantic 警告说它被 ISO C++ 禁止)。我知道如果标准不允许这样做显然是个坏主意,但我以前什至不知道这是可能的。

我的问题是,如果标准不允许,为什么 g++ 允许不动态分配的可变长度数组?另外,如果编译器可以做到这一点,为什么不是它在标准中?

【问题讨论】:

标签: c++ standards-compliance dynamic-arrays


【解决方案1】:

因为它在 C99 中受支持。我真的不能说为什么它不在 C++ 标准中。然而,它并没有你想象的那么有用,因为它很容易导致(如果你不小心的话)堆栈溢出(因为它通常基于alloca,它本身是非标准的)。另一个错误是返回一个指向动态数组的指针,它会立即超出范围。

【讨论】:

  • 所以最好还是坚持使用 C99 中的动态分配数组,即使它在标准中?
  • @Maulrus 从不使用基于用户输入的尺寸的 VLA。但是,堆分配的数组也是如此。无论哪种方式,您都必须验证用户输入。所以我在这里看不到 VLA 特有的问题。这是我的粗略指导:如果数据集很小,请使用一个小的静态大小的数组和一个 int 表示使用了多少元素。如果数据集很大,请使用堆。不过,我没有看到 VLA 的用例。
  • 它可能不在 1995 年的 C++ 标准中,因为它早于 C99 的可变长度数组标准化。它可能不在即将发布的标准中,因为 vector<> 提供了类似的功能。
  • @Maulrus:是的,因为 C99 还没有得到 C89 的广泛支持。
【解决方案2】:

C99 中的 C 语言中添加了对可变长度数组 (VLA) 的支持。

很可能由于 gcc 中存在对它们的支持(以支持 C99),因此将对它们的支持添加到 g++ 中相对简单。

也就是说,它是一种特定于实现的语言扩展,如果您希望您的代码具有可移植性,那么使用特定于实现的扩展并不是一个好主意。

【讨论】:

  • 我不知道它在 C 标准中。这解释得很好,谢谢!
  • @Maulrus:请记住,在 C 标准中,这与 C++ 标准完全分开。
【解决方案3】:

许多编译器都采用和扩展标准。有两个基本原因:

  1. 邪恶的编译器编写者可能认为,让他们更难摆脱他们的编译器有助于延长寿命。
  2. 仁慈的编译器编写者可能会认为,在他们可以为您提供更多选择时,他们自己付出的代价很小甚至没有。

【讨论】:

    【解决方案4】:

    所有提到的与它们在 C 中有关的原因都是正确的,尽管要求有限制。您的示例可能展示了比 C 中所需的更灵活的支持(如果您使用 scanf 而不是 cin 实现,请将其放入 .c 文件并使用 gcc)。

    这几乎只是对 alloca(自动分配)的隐式调用,它只是减少堆栈指针(增加堆栈大小)并将新的堆栈指​​针复制到另一个寄存器,该寄存器用作指向已分配内存的指针。

    不同之处在于构造函数和析构函数不会在使用 alloca 创建的对象上调用。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2011-10-15
      • 2013-08-02
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多