我能在C++03和C++11中使用C变长数组吗?

3

C语言有一个非常酷的功能,叫做变长数组。它在C90及以上版本中可用,并允许推迟数组的大小到运行时确定。请参见GCC手册6.19 变长数组

我正在使用C++。在std=c++11下,由于在Cygwin下使用alloca而导致编译失败。如果可能的话,我想切换到变长数组。我还想尝试避免使用std::vectorstd::array,因为我想避免内存管理器。我相信每一点都有帮助,所以我很高兴抓住这些机会(有些人认为这是窥视孔)。

我能在C++03和C++11中使用变长数组吗?


你可以使用alloca来实现VLA。 - SwiftMango
在你的程序中加入一些合理的限制并使用静态大小的数组会有问题吗? - paddy
不是边界检查让我困扰,而是每次调用这个特定函数时都要进入内存管理器......由于我不能依赖动态数组(感谢Basile),所以我将不得不考虑切换到std::array,因为这是C++ 11。 - jww
2个回答

8

VLA不符合C++03或C++11标准,因此如果您想编写严格符合标准的代码(并使用例如std::vector,一般使用堆来存储数据-但您可以使用自己的分配器...),最好避免使用它们。

然而,一些C++编译器(如GCCClang)接受VLA作为扩展。

对于flexible array members,情况也是如此;它们在C++中不是标准的(只有在C中),但某些编译器接受它们。

dynarray-s没有进入C++11标准...


谢谢Basile。我有点担心那个问题。很高兴我问了。还有感谢你的回答。 - jww
我跟着你提供的链接柔性数组成员看了一下,但是不太明白它们有什么特别之处。它们难道不就是struct {unsigned length; double*array; };的变体吗?也就是说,用double*array代替了double array[] - Walter
@Walter:不,指针不是数组。当分配一个指向以柔性数组成员结尾的结构体的指针时,通常会为该柔性数组成员分配一些额外空间。 - Basile Starynkevitch

2

如果您想要符合标准的C++代码,那么不支持变长数组。

C++标准不支持VLA,但一些C++编译器作为供应商特定的扩展进行支持。

您可以使用标准的vector在C++中实现类似的效果。请注意,与只能在创建时调整大小的VLA不同,标准的vector可以根据需要重新调整大小(在执行适当的操作后)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接