为什么和如何C++允许使用动态值创建编译时数组

Why & How C++ allows compile time arrays to be created using dynamic values

本文关键字:创建 编译 数组 动态 许使用 C++ 为什么      更新时间:2023-10-16

在编写一些代码时,我意识到我的一个代码工作,根据我的理解,它不应该工作。代码是

int main() {
    int val;
    cin>>val;
    int array[val];
}

不仅如此,甚至下面的代码也可以工作

 int main() {
        int valone = rand();
        int valtwo = rand();
        int array[valone][valtwo];
    }

我一直明白静态数组需要常量值,或者编译器在编译时可以推导出的值。

最近的 C++11/14 规范是否有任何变化,或者自开始以来C++都是如此。

注意:在这种情况下,Visual Studio 编译器确实会给出错误,但g++ 以及clang成功编译上述代码

它是一个可变长度数组。

这些由C99支持,GCC和Clang都支持它们作为非标准扩展C++。(它们不是C++语言的一部分。MSVC 不支持 C99,因此根本不支持它们。

在标准C++中,应改用std::vector

这是一个名为可变长度数组的编译器扩展。正如您所说,这不是标准C++,因此在尝试编写符合交叉编译器的代码时不应依赖它。相反,您可以将std::vector用于"动态数组",这是标准的。

有一些编译器允许可变长度数组作为语言的扩展。如果你想要可移植的代码,不要依赖它,而是使用std::vector

可变长度数组在 c++ 中不是标准的。一些编译器支持它,但作为非标准扩展。

例如,请参阅此处有关此扩展的 gcc 文档。

VLA是一个非常有用的结构。它们允许人们创建编译时已知大小的数组,但使用自动内存,而不是像向量那样依赖动态内存管理。

避免动态分配可能有多种原因,其中最重要的是它造成的性能损失(特别是在多线程场景中)以及某些MCU上缺乏动态内存控制。