3
#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++ 命令)。

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

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

4

3 回答 3

2

那是编译器方面的扩展。它是如何工作的?好吧,它只在某种程度上起作用。

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

于 2012-09-18T21:22:12.250 回答
0

您的示例中的 myArray 是在堆栈上分配的。g++ 有一个允许这个技巧的扩展。不需要堆来执行此操作,编译器只需生成代码以将堆栈指针增加在运行时计算的数量。

于 2012-09-18T21:21:11.953 回答
0

VLA 是一种扩展,许多实现对 C++ 语言都有自己的扩展。如果您希望 g++ 抱怨您不遵守标准,请传递-pedantic标志。VLA 位于堆栈上,速度非常快,但是,这也是问题的原因,因为您的堆栈空间有限。然而,在 C++ 中,我们有类似std::vector等的结构,因此实际上没有必要使用它们。

于 2012-09-18T21:28:48.847 回答