【问题标题】:Can I use a C Variable Length Array in C++03 and C++11?我可以在 C++03 和 C++11 中使用 C 可变长度数组吗?
【发布时间】:2015-10-17 04:18:04
【问题描述】:

C 有一个非常酷的特性,称为可变长度数组。它在 C90 及更高版本中可用,它允许将数组的大小推迟到运行时。请参阅 GCC 的手册 6.19 Arrays of Variable Length

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

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

【问题讨论】:

  • 使用alloca可以实现VLA
  • 在程序上设置一些合理的界限并使用静态大小的数组会不会有问题?
  • 困扰我的不是边界检查。每次调用这个特定函数时,它都会一次又一次地进入内存管理器......因为我不能依赖动态数组(感谢 Basile),我将不得不考虑切换到std::array,因为这是 C++ 11。

标签: c++ arrays c++11 gcc variable-length-array


【解决方案1】:

VLAs 不在标准 C++03 或 C++11 中,所以如果你想编写严格符合标准的代码,最好避免使用它们(并使用例如 std::vector,它通常使用堆它的数据 - 但您可以使用自己的分配器...)。

但是,一些 C++ 编译器(最近的 GCCClang)正在接受 VLA 作为扩展。

flexible array members也一样;它们在 C++ 中不是标准的(仅在 C 中),但一些编译器接受它们。

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

【讨论】:

  • 谢谢巴西尔。我有点担心。我很高兴我问了。并感谢您的回答。
  • 我跟随你的链接到flexible array members 并且不明白它们有什么特别之处。它们不是和struct {unsigned length; double*array; }; 一样吗,即double*array 而不是double array[]
  • @Walter:不,指针不是数组。当分配指向以灵活数组成员结尾的struct 的指针时,您通常会为该灵活数组成员分配一些额外空间。
【解决方案2】:

如果您想要标准 C++ 的代码,则不需要。

没有 C++ 标准支持 VLA,但一些 C++ 编译器可以作为特定于供应商的扩展。

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

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2014-03-27
    • 2012-12-14
    • 2014-01-05
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多