gpt4 book ai didi

c++ - 为什么 C++ 不支持堆栈上的动态数组?

转载 作者:IT老高 更新时间:2023-10-28 12:43:50 27 4
gpt4 key购买 nike

在 C99 中这是合法的:

void f(size_t sz) {
char arr[sz];
// ...
}

但是,这个 - 动态大小的堆栈数组 - 在 C++ 中已被删除,并且在 C++11 中没有看到返回。

AFAIK C++ 考虑到 C 兼容性,所以我想肯定有一些很好的论据不包括这个有用的特性,对吧?

我能想到的只有这个:

优点

  • 通过允许需要在堆栈上的更智能的数组大小(临时缓冲区?)来节省内存。
  • 更少的“智能指针”(或更糟糕的是,手动引入错误的 delete [])和缓慢的堆分配。
  • 与 C99 的兼容性。

缺点

  • 允许人们轻松地在堆栈上分配太大的数组,从而导致难以调试的堆栈溢出。
  • 编译器编写者更复杂。

那么,为什么他们在导入其他 C99 功能时没有包含它?


为了防止这被认为是“主观的”或“不具建设性的”,我正在寻找委员会成员的报价或讨论此事的讨论链接——当然还有加分,以便快速总结。

与其将其视为小马与仓鼠的讨论,不如将其视为一个历史问题,仅仅是对所考虑的优点和缺点的兴趣(如果有的话)。


编辑:正如 James McNellis 在下面的评论中指出的那样,C++ 存在于 C99 标准化可变长度数组之前。您可能会将我的问题解读为:“他们为什么没有也不会添加它?”。

最佳答案

我认为,这是因为 C++ 提供了卓越的解决方案:std::vector<T>std::array<T,N> (C++11);尽管后者本身不是动态的,但它优于原始数组。无论您传递 vector 或数组的哪个函数,您始终可以知道大小。

由于 C 无法提供这些解决方案,C99 提出了可变长度数组 (VLA)。它与普通数组有同样的问题:它在传递给函数时衰减为一个指针,并且您不再知道数组的大小。

正如 Florian Weimer 所问 herecomp.std.c++如果 C++0x 允许 VLA,那么下面的代码是什么意思?

int vla[n]; //n is known at runtime!
std::vector<decltype(vla)> v; //what does this mean?

当 vector 模板的类型参数取决于n时,编译器如何在编译时实例化 vector 模板哪个在运行时已知?

关于c++ - 为什么 C++ 不支持堆栈上的动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com