由于我通常使用的 C++ 编译器允许可变长度数组(例如,取决于运行时大小的数组),我想知道是否有类似std::array
可变大小的东西?当然std::vector
是可变大小的,但它在堆上分配,并在需要时重新分配。
我喜欢在运行时定义大小的堆栈分配数组。是否有任何std
可能具有此功能的模板?也许使用std::vector
固定的最大尺寸?
由于我通常使用的 C++ 编译器允许可变长度数组(例如,取决于运行时大小的数组),我想知道是否有类似std::array
可变大小的东西?当然std::vector
是可变大小的,但它在堆上分配,并在需要时重新分配。
我喜欢在运行时定义大小的堆栈分配数组。是否有任何std
可能具有此功能的模板?也许使用std::vector
固定的最大尺寸?
目前正在制定两个建议,将运行时固定大小的数组引入 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 的状态是什么?
正如丹尼尔在评论中所说,大小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();
}
但。仍然向量的内容将存储在堆上,而不是堆栈上。问题是,编译器必须知道在函数执行之前应该为函数分配多少空间,因此根本不可能在堆栈上存储可变长度数据。
也许使用
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]; }
其他一些类似的解决方案: