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

在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); 尽管后者不是动态的,但它优于原始数组。 无论您通过向量或数组传递哪个函数,都可以知道大小。

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

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

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

    编译器如何在运行时已知类型参数取决于n ,在编译时实例化矢量模板?


    这个功能在很大程度上与std::vector ,只不过它消耗了更有限的资源(堆栈vs堆空间)。 因此,在C ++语义方面并不需要它。

    人们可以争辩说堆栈分配可以提高效率(特别是在多线程的情况下)。 然而,这也可以在C ++中使用自定义分配器在堆栈或堆上构建私有内存池来实现。 这比将内存放在堆栈上更灵活,实际上,您可以创建一个自定义分配器,以便轻松地从堆栈内存缓冲区中分割出大块。 它与动态数组语义不完全相同,但是自定义分配器和STL容器的存在涵盖了大多数需要堆栈分配的用例。

    链接地址: http://www.djcxy.com/p/3057.html

    上一篇: Why doesn't C++ support dynamic arrays on the stack?

    下一篇: Need a formula: Extracting Years from Seconds Since January 1, 0001 12:00 AM