24

由于我通常使用的 C++ 编译器允许可变长度数组(例如,取决于运行时大小的数组),我想知道是否有类似std::array可变大小的东西?当然std::vector是可变大小的,但它在堆上分配,并在需要时重新分配。

我喜欢在运行时定义大小的堆栈分配数组。是否有任何std可能具有此功能的模板?也许使用std::vector固定的最大尺寸?

4

3 回答 3

20

目前正在制定两个建议,将运行时固定大小的数组引入 C++,您可能会感兴趣:

  • 具有自动存储持续时间的运行时大小的数组。这将使运行时大小的数组成为一种语言特性(如在 C11 中)。所以你可以这样做:

      void foo(std::size_t size) {
        int arr[size];
      }
    
  • C++ 动态数组。这将为库带来一个新的容器,std::dynarray在构造时给定一个固定的大小。它旨在优化以尽可能在堆栈上分配。

      void foo(std::size_t size) {
        std::dynarray<int> arr(size);
      }
    

这些都作为数组扩展技术规范的一部分进行工作,该规范将与 C++14 一起发布。

更新:std::dynarray 尚未实现(2021 年 8 月 25 日)。请参阅dynarrays 的状态是什么?

于 2013-12-31T12:56:28.520 回答
9

正如丹尼尔在评论中所说,大小std::array被指定为模板参数,因此无法在运行时设置。

您可以std::vector通过构造函数参数传递最小容量来构造:

#include <vector>

int main(int argc, char * argv[])
{
    std::vector<int> a;
    a.reserve(5);
    std::cout << a.capacity() << "\n";
    std::cout << a.size();

    getchar();
}

但。仍然向量的内容将存储在堆上,而不是堆栈上。问题是,编译器必须知道在函数执行之前应该为函数分配多少空间,因此根本不可能在堆栈上存储可变长度数据。

于 2013-12-31T12:48:31.850 回答
1

也许使用std::vector固定的最大尺寸?

如果允许提升,那么boost::container::static_vector是我能想到的最接近的。

static_vector是一个序列容器,类似于boost::container::vector具有可以改变大小的连续存储,以及静态分配、低开销和固定容量boost::array

每个对象的大小仍然是固定的,但如果分配的数量很大和/或项目数量很少,那么它是值得的

boost::container::small_vector如果向量可以超出限制,则为另一种解决方案。仅当大小大于定义的限制时才会触及堆

small_vector是一个类似向量的容器,针对包含少量元素的情况进行了优化。它包含一些就地预分配的元素,当实际元素数量低于预分配阈值时,可以避免使用动态存储分配。

boost::container::static_vector<int, 1024> my_array;
boost::container::small_vector<int, 1024> my_vector;

如果您使用 Qt,那么QVarLengthArray是另一种方法:

QVarLengthArray是试图解决 C++ 语言中的这一差距。它在堆栈上分配一定数量的元素,如果将数组调整为更大的大小,它会自动使用堆。堆栈分配的优点是它比堆分配快得多。

例子:

int myfunc(int n)
{
    QVarLengthArray<int, 1024> array(n + 1);
    ...
    return array[n];
}

其他一些类似的解决方案:

于 2022-01-25T14:09:47.870 回答