【问题标题】:Non-statically-sized array on stack堆栈上的非静态大小数组
【发布时间】:2014-01-31 22:24:22
【问题描述】:

我想在堆栈上创建一个在运行时大小不同的数组。据我所知,这在 c++ 中总是非法的:

void local_array(unsigned int i) {
    int arr[i];
}

但是,可以使用递归在堆栈上动态分配内存。有没有不使用递归的不同方法来实现这一点?如果不是,有哪些技术限制阻碍了上述示例的实现?

【问题讨论】:

  • @Blacktempel std::vector 在堆上分配内存。
  • 我不知道你想做什么,我也不确定你是否知道。在 B 中,除非它不在堆栈中(arr != null),否则堆栈中始终有一个包含 1 个元素的数组。
  • 如果没有像 gcc 这样的实现扩展(它支持您显然想要的 VLA),您将无法从仅符合标准的实现中获得运行时支持。至少不是现在。 (而 B 甚至不接近连续数组)。
  • @user270349 我不确定你的意思。该函数被递归调用,每次调用它都会在堆栈上添加一个整数。这加起来就是一个整数数组。一个 int 指针可以指向堆栈上的东西——在这种情况下,它指向第一次调用 local_array_recursive 时压入的整数。一旦 i 为 0,则数组已完全构造,可以像任何其他数组一样读写。
  • 我不相信您对该数组的位是连续的有任何保证。

标签: c++ arrays stack


【解决方案1】:

没有技术限制。

你可以在 C++14 中做到这一点,它已经在 clang & gcc 最新版本中实现了。

void test(int n)
{
   int a[n]; //ok now
   cout << a[0] << endl; //output a random value on stack!
}

【讨论】:

  • 这么晚才被接受的原因是什么?
  • 除了不确定数据评估的未定义行为(在评论中确认)之外,这是正确的。
  • @NmdMystery 原因是,C++ 有向量,没有理由使用堆栈动态数组。它最近被接受为标准,主要是为了兼容最新的 C 语言标准 C11。由于C没有向量,所以C有它的动机,它被接受为C11。
  • @user534498 Visual-C++ 2013 不允许这样做,而且它应该与 C11 几乎兼容。我想这是它缺少的东西之一。编辑:C11
【解决方案2】:

此类功能于 2013 年 4 月提出 (N3639 - Runtime-sized arrays with automatic storage duration) 并被接受。

它现在是 C++ 2013-05-15 Committee Draft 的一部分

从 8.3.4 开始:

void f(unsigned int n)
{
    int a[n]; // type of a is “array of runtime bound of int”
}

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 2023-04-01
    • 2023-04-10
    • 2015-05-05
    • 2016-08-06
    • 2017-06-24
    • 2014-06-01
    • 2014-11-23
    相关资源
    最近更新 更多