c++中有可变长度数组吗?

Posted

技术标签:

【中文标题】c++中有可变长度数组吗?【英文标题】:Are variable length arrays there in c++? 【发布时间】:2014-03-27 15:09:32 【问题描述】:

我一直认为 c++ 中不允许使用可变长度数组(请参阅:Why aren't variable-length arrays part of the C++ standard?)。但是为什么这段代码可以编译和工作?

#include <iostream>
using namespace std;

int main () 

    int n;
    cin >> n;

    int a[n];

    for (int i=0; i<n; i++) 
        a[i] = i;
    

    for (int i=0; i<n; i++) 
        cout << a[i] << endl;
    

【问题讨论】:

可变长度数组将在 C++14 中使用 它们由 C99 和 GCC >= 4.7 指定(以及 Clang 太 AFAIK)也将其作为 C++ 的扩展。 VLA 没有进入 C++14 为什么没有人提到vector?! @MarsonMao 变长数组,如果实现的话会在栈中分配内存,而vector在堆中分配内存。 【参考方案1】:

当前的 C++ 标准不要求编译器支持 VLA。但是,允许编译器供应商支持 VLA 作为扩展。例如,GCC >= 4.7。

最初提议 VLA 将出现在 C++14 中,但该提议没有成功。它们最终也没有出现在 C++17 中。

【讨论】:

真的会得到支持吗?它们已被广泛讨论,并提出了许多似乎难以解决的问题(最臭名昭著的是array.~dynarray(); new (&amp;array) dynarray..;)。 @MatthieuM。运行时大小的数组是 C++14 的一部分。它们与 C VLA 并不完全相同。问题中的代码在 C99 中的工作方式与 C++14 相同。好吧,以cout 的使用为模,依此类推。其中数组部分是我关注的重点。 我的理解是dynarray的状态处于不确定状态。 @Matthieu 我不是在谈论 dynarray 是的,C++ 中 VLA 的提议是一个笑话,而且是一个糟糕的提议:它几乎只允许堆栈上的一维 VLA。它不像 C99 那样为指向可变长度数组的指针提供任何支持,因此不允许分配 2D VLA 并将其传递给函数以处理数据。【参考方案2】:

C99 允许 VLA,但 C++ 绝不允许,因为 VLA 的性能非常不友好。而在 C11 中,VLA 成为可选功能。

之前,据说 VLA 会出现在 C++17。但是现在 C++17 发布了,也没有 VLA。 (而且好像C++20不会有VLA,最近的文档根本没谈过。)

虽然标准不支持它,但 GNU 编译器支持它作为一个扩展

【讨论】:

“C++ 不允许这样做,因为 VLA 的性能非常不友好。” 因此,您将获得官方讨论的链接,其中以性能为理由反对在 C++ 中包含 VLA? C++20 几年后才会发布。也许您的意思是委员会提出了暂定草案? @StephenM.Webb 是的,也许我用错了词,我会编辑它,谢谢。 @underscore_d 那么,您对 C11 为何将其设为可选功能以及为何 C++ 不支持它有何看法?感谢您的评论。 别想把这当押在我身上!你是写答案的人,所以你应该引用你的来源。我的意思是,您甚至在回答中提到了“最近的文档”,但不知何故您无法链接到其中任何一个。

以上是关于c++中有可变长度数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 c++20 协程中使用 alloca() 或可变长度数组扩展吗?

为啥我可以在 C++ 中定义这个可变长度数组? [复制]

C++ 可变长度数组 (VLA) 警告

在 MS Visual C++ 中启用 VLA(可变长度数组)?

在 C++ 中声明可变长度二维数组的正确方法

C 和 C++ 中的可变长度数组 (VLA)