【发布时间】:2011-11-19 12:09:39
【问题描述】:
在 C99 中这是合法的:
void f(size_t sz) {
char arr[sz];
// ...
}
但是,这个 - 动态大小的堆栈数组 - 在 C++ 中已被删除,并且在 C++11 中没有看到返回。
AFAIK C++ 是在考虑 C 兼容性的情况下制作的,所以我想肯定有一些很好的论据不包括这个有用的特性,对吧?
我能想到的只有这个:
优点
- 通过允许需要在堆栈上的更智能的数组大小(临时缓冲区?)来节省内存。
- 更少的“智能指针”(或更糟糕的是,手动引入错误
delete []'s)和缓慢的堆分配。 - 与 C99 的兼容性。
缺点
- 允许人们轻松地在堆栈上分配太大的数组,从而导致难以调试的堆栈溢出。
- 编译器编写者更复杂。
那么,为什么他们在导入其他 C99 功能时没有包含它?
为了防止这被认为是“主观的”或“不具建设性的”,我正在寻找委员会成员的报价或讨论此事的链接——当然还有加分,以便快速总结。
与其将其视为小马与仓鼠的讨论,不如将其视为一个历史问题,仅仅是对所考虑的优点和缺点的兴趣(如果有的话)。
编辑:正如 James McNellis 在下面的 cmets 中指出的那样,C++ 存在于 C99 标准化可变长度数组之前。您可能会将我的问题解读为:“他们为什么没有也不会添加它?”。
【问题讨论】:
-
它没有被“删除”,因为它从来都不是 C++ 的一部分。
-
顺便说一句,在我看来,这似乎是一个有明确答案的明确问题。这似乎不是主观的,虽然“丢弃”这个词有点负荷并且不完全准确,但我认为这是一个小问题。
-
我有点惊讶人们如此喜欢结束“为什么?”作为“主观”的问题。恕我直言,StackOverflow 上的许多 最佳 问题确实是“为什么”问题。(参见 here。)仅仅因为多人可以对答案有多种猜测并不意味着没有正确答案。我认为人们应该冷静下来,让这样的问题继续下去,而不是仅仅因为他们想不出一个客观的答案而当场关闭它们。 :\
-
结束问题的原因是为了保持 SO 上内容的质量。在剩下的所有蹩脚问题中,this 问题是如何引起如此多争议的?让它保持打开状态;很有帮助也很有趣。
-
这不是一个糟糕的问题,因为它是主观的,它很糟糕,因为它是重复的。 :-)
标签: c++ stack standards dynamic-arrays