【发布时间】:2021-12-31 12:51:02
【问题描述】:
在过去的几年里,我没有经常使用 C。今天在阅读this question 时,遇到了一些我不熟悉的 C 语法。
显然在C99 中,以下语法是有效的:
void foo(int n) {
int values[n]; //Declare a variable length array
}
这似乎是一个非常有用的功能。是否曾讨论过将其添加到 C++ 标准中,如果有,为什么省略?
一些潜在的原因:
- 编译器供应商难以实现
- 与标准的其他部分不兼容
- 可以使用其他 C++ 结构来模拟功能
C++ 标准规定数组大小必须是常量表达式 (8.3.4.1)。
是的,我当然意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆而不是堆栈分配内存。如果我想要一个多维数组,例如:
void foo(int x, int y, int z) {
int values[x][y][z]; // Declare a variable length array
}
vector 版本变得相当笨拙:
void foo(int x, int y, int z) {
vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
切片、行和列也可能分布在整个内存中。
看看comp.std.c++ 的讨论,很明显这个问题是相当有争议的,争论双方都有一些非常重量级的名字。当然,std::vector 总是更好的解决方案并不明显。
【问题讨论】:
-
只是出于好奇,为什么需要在栈上分配呢?你害怕堆分配性能问题吗?
-
@Dimitri 不是真的,但不可否认堆栈分配将比堆分配快。在某些情况下,这可能很重要。
-
可变长度数组的主要优点是所有数据都靠得很近,因此当您遍历该数组时,您可以彼此相邻地读取和写入字节。您的数据被提取到缓存中,cpu 可以处理它而无需从内存中获取和发送字节。
-
可变长度数组也可用于用静态常量变量替换预处理器常量。同样在 C 中,您没有其他 VLA 选项,有时需要编写可移植的 C/C++ 代码(与两种编译器兼容)。
-
顺便说一句,clang++ 似乎允许 VLA。
标签: c++ arrays standards variable-length-array variable-length