#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
数组是在 堆 或 中分配的堆栈 区域?
答案 0 :(得分:2)
这是编译器端的扩展。 它是如何工作的?嗯,它只在某种程度上 。
实现基本上将堆栈指针移动一个数量,该数量取决于数组的大小,并通过数组的名称调用中间的内存。它只在某种程度上起作用,因为在VLA中,大小不是该类型的组成部分,这意味着许多可用于常规数组的构造无法使用此类型完成,例如通过引用将数组传递给模板... sizeof
通常是提供的,但是作为运行时构造实现。
答案 1 :(得分:0)
示例中的myArray是在堆栈上分配的。 g ++有一个允许这个技巧的扩展。堆不是必须这样做的,编译器只生成代码以将堆栈指针增加一个在运行时计算的量。
答案 2 :(得分:0)
VLA是扩展,许多实现都有自己的C ++语言扩展。如果你想让g ++抱怨你没有遵守标准,那就传递-pedantic
标志。堆栈中的VLA非常快,但由于堆栈空间有限,这也是问题的原因。但是在C ++中,我们有std::vector
等结构,所以实际上没有必要使用它。