静态分配的可变大小数组如何在C ++中工作?

时间:2012-09-18 21:17:44

标签: c++ compiler-errors g++ dynamic-memory-allocation static-memory-allocation

#include <iostream>

    using namespace std;

    int main(int argc, const char * argv[])
    {

        int size;
        cin >> size;
        int myArray[size]; //this shouldn't compile , right ? 

        return 0;
    }

我认为这不会编译,但实际上(使用g ++命令)。

我后来发现GCC实际上允许可变大小的数组,即使标准C ++不支持可变大小的数组,这很奇怪!因为我听到大家都说创建可变大小数组的唯一方法是使用动态分配,如int* array = new int[size];或更好std::vector。我以为GCC不会允许这段代码!

无论如何,我的理论问题是,myArray数组是在 中分配的堆栈 区域?

3 个答案:

答案 0 :(得分:2)

这是编译器端的扩展。 它是如何工作的?嗯,它只在某种程度上

实现基本上将堆栈指针移动一个数量,该数量取决于数组的大小,并通过数组的名称调用中间的内存。它只在某种程度上起作用,因为在VLA中,大小不是该类型的组成部分,这意味着许多可用于常规数组的构造无法使用此类型完成,例如通过引用将数组传递给模板... sizeof通常是提供的,但是作为运行时构造实现。

答案 1 :(得分:0)

示例中的myArray是在堆栈上分配的。 g ++有一个允许这个技巧的扩展。堆不是必须这样做的,编译器只生成代码以将堆栈指针增加一个在运行时计算的量。

答案 2 :(得分:0)

VLA是扩展,许多实现都有自己的C ++语言扩展。如果你想让g ++抱怨你没有遵守标准,那就传递-pedantic标志。堆栈中的VLA非常快,但由于堆栈空间有限,这也是问题的原因。但是在C ++中,我们有std::vector等结构,所以实际上没有必要使用它。