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

How a statically-allocated variable-size array works in C++ ?

本文关键字:C++ 工作 数组 小数 分配 静态      更新时间:2023-10-16
#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数组是在堆栈区域中分配的?

这是编译器端的扩展。它是如何工作的?好吧,它只在一定程度上有效。

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

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

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