可变长度std::类数组 P>因为我常用的C++编译器允许可变长度数组,如数组依赖于运行时大小,我想知道是否有类似STD::数组的大小可变?当然std::Vectori的大小是可变的,但它在堆上分配,并根据需要重新分配

可变长度std::类数组 P>因为我常用的C++编译器允许可变长度数组,如数组依赖于运行时大小,我想知道是否有类似STD::数组的大小可变?当然std::Vectori的大小是可变的,但它在堆上分配,并根据需要重新分配,c++,std,variable-length-array,C++,Std,Variable Length Array,我喜欢在运行时定义大小的堆栈分配数组。是否有任何std模板可能具有此功能?可能使用具有固定最大大小的std::vector 如Daniel在注释中所述,std::array的大小被指定为模板参数,因此无法在运行时进行设置 您可以通过将最小容量传递给构造函数参数来构造std::vector: #include <vector> int main(int argc, char * argv[]) { std::vector<int> a; a.reserve

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

如Daniel在注释中所述,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();
}

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

< P>有两个建议,目前正在将运行时固定大小的数组引入C++中,这可能对您有兴趣:

。这将使运行时大小的数组成为类似C11的语言特性。所以你可以做:

void foo(std::size_t size) {
  int arr[size];
}
。这将为库std::dynarray带来一个新的容器,它在构建时具有固定的大小。其目的是尽可能优化以在堆栈上分配

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

这些都是作为Array Extensions技术规范的一部分进行的,该规范将与C++14一起发布。

当使用std::Array时,数组的大小是一个模板参数,因此它不能是一个运行时变量。我想std::vector是你最好的选择。因为语言标准中没有堆栈,所以很难使这个问题精确或有意义。@DanielKamilKozar:Meh。将这样一个概念精确化将是类型系统上一个相当奇怪的疣子。您可以在Github的修订历史中看到自己的努力。到目前为止,我们的想法是没有足够的经验,所以它被推迟了。通常的答案是使用std::vector和自定义分配器。由于您希望数据位于堆栈上,因此假定它们总是以与分配相反的顺序释放。考虑到这个限制,编写一个极快的线程本地分配器应该是相当容易的。缺点是,您将预先进行单独的分配以存储数据,但这与操作系统为线程堆栈所做的工作并没有多大区别——在现代操作系统上,您的块在使用之前是虚拟的,就像堆栈一样。但它不会从堆栈在缓存中处于热状态中获益。@KerrekSB:什么意思,没有堆栈?自动存储的行为类似于堆栈,语言规范有时将其称为堆栈,例如,当抛出异常时,堆栈展开,因此为什么不将其称为堆栈?您所做的并不是通过构造函数参数设置最小容量。这样做的目的是设置初始大小和size@BenjaminBannier你说得对。实际上,这个目标是可以实现的,但是使用reserve的解决方案要优雅得多。这是基于堆的,这就是我不想要它的原因,并问了我的问题。。。但是,如果可以实现std::vector来分配堆栈上的初始容量,并在第一次重新分配时切换到堆。这将不工作的储备,因为它必须做的第一次分配。。。但那会很酷。然而,我怀疑它在通常的实现中是这样工作的,所以第二个看起来非常好。到今天为止是否有实现?@JosephMansfield也许应该将其合并到?