开发者社区> 问答> 正文

为什么可变长度数组不属于C ++标准?

在过去的几年中,我很少使用C。今天,当我阅读此问题时,遇到了一些我不熟悉的C语法。

显然,在C99中,以下语法有效:

void foo(int n) { int values[n]; //Declare a variable length array } 这似乎是一个非常有用的功能。是否曾有关于将其添加到C ++标准的讨论,如果是,为什么将其省略?

一些潜在的原因:

编译器厂商难以实施 与标准的其他部分不兼容 可以使用其他C ++结构来模拟功能 C ++标准声明数组大小必须是一个常量表达式(8.3.4.1)。

是的,我当然知道在玩具示例中可以使用std::vector 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 > > values( /* Really painful expression here. */); } 切片,行和列也可能会散布到整个内存中。

纵观讨论,comp.std.c++很明显,这个问题在论点两边都有一些非常重量级的名字,引起了很大争议。当然,std::vector总是可以找到更好的解决方案。

展开
收起
保持可爱mmm 2020-01-15 16:46:00 532 0
1 条回答
写回答
取消 提交回答
  • 最近在usenet中开始了对此的讨论:为什么C ++ 0x中没有VLA。

    我同意那些似乎同意必须在堆栈上创建潜在的大型阵列(通常只有很少的可用空间)的做法不好的人。该参数是,如果您事先知道大小,则可以使用静态数组。而且,如果您事先不知道大小,您将编写不安全的代码。

    C99 VLA可以提供一个小的好处,即能够创建小的数组而不会浪费空间或为未使用的元素调用构造函数,但是它们会给类型系统带来相当大的变化(您需要能够根据运行时值指定类型-这除new运算符类型说明符外,当前C ++中尚不存在该表达式,但对它们进行了特殊处理,以使运行时不会逃脱new运算符的范围)。

    您可以使用std::vector,但它并不完全相同,因为它使用动态内存,并且使用它自己的堆栈分配器并不是一件容易的事(对齐也是一个问题)。它还不能解决相同的问题,因为矢量是可调整大小的容器,而VLA是固定大小的。在C ++动态阵列提议旨在介绍文库的基于溶液,作为替代基于VLA的语言。但是,据我所知,它不会成为C ++ 0x的一部分。

    问题来源于stack overflow

    2020-01-15 16:46:23
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载