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 (&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() 或可变长度数组扩展吗?