【问题标题】:What is happening with array storage? [duplicate]阵列存储发生了什么? [复制]
【发布时间】:2011-11-17 13:24:15
【问题描述】:

可能重复:
Dynamic array in Stack?
How do compilers treat variable length arrays

我辅导的某个人写了一段代码,看起来像这样,编译、运行正常,让我在这个过程中感觉自己是一个完整的 C++ 初学者:

int main(int argc, char** argv)
{
    int Index=0;
    cin>>Index;
    int Test_array[Index][Index];
    ...
}

现在,我在这里找到了为什么它有效的答案:about the array in C

但是,我仍然对如何进行询问。

我的意思是,代码块的堆栈大小应该提前知道,对吧?所以可以肯定的是,Test_array 不能存储在堆栈中...

编译器是否在后台执行 new/malloc-delete/free 操作以将堆内存用于数组?

在这种情况下,如果在堆上找不到足够的内存,这样的代码会抛出 bad_alloc 异常吗?

【问题讨论】:

  • 这不是标准的 C++。可变长度数组是一些编译器支持的扩展。
  • 之前被问过很多次。
  • 不是重复的:问题不是“这有效吗?”,而是“编译器如何做到这一点?”

标签: c++ arrays


【解决方案1】:

在运行时唯一的区别是堆栈指针增加了一个变量偏移量,而不是一个常量。在堆栈上“分配”内存只涉及增加堆栈指针。编译器是否知道这个值会影响一些优化,但这当然是可能的。

作为一个非常粗略的例子,区别在于:

add sp <sizeof(int) * 5>

add sp <sizeof(int) * nIndex>

在引入 VLA-s 之前做到这一点的方法是使用 alloca 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2012-06-06
    • 2017-10-04
    • 2016-06-28
    • 2011-04-12
    • 2021-04-12
    • 2021-06-06
    相关资源
    最近更新 更多