C++ 我可以在编译时不知道大小的情况下在堆栈上分配'std::array'吗?

C++ 我可以在编译时不知道大小的情况下在堆栈上分配'std::array'吗?,c++,C++,在堆栈上分配时,我不一定需要知道编译时分配的C数组的大小。i、 e.我可以做到: void foo(size_t s) { uint8_t bar[s]; // `s` not known at compile time some_func_that_uses_bar(bar, sizeof(bar)); } void foo(size_t s) { uint8_t bar[s]; // `s` not known at compile time some_fu

在堆栈上分配时,我不一定需要知道编译时分配的C数组的大小。i、 e.我可以做到:

void foo(size_t s) {
    uint8_t bar[s]; // `s` not known at compile time
    some_func_that_uses_bar(bar, sizeof(bar));
}
void foo(size_t s) {
    uint8_t bar[s]; // `s` not known at compile time
    some_func_that_uses_bar(bar, sizeof(bar));
}

但是,为了减少错误,我觉得我应该能够用C++ +Cux:St::StaseS来完成这一点,但是我还没能弄清楚如何(甚至也不可能)。C为可变长度数组增加了特殊的支持,但是C++没有。使用可以获得类似的效果,但这不是一个标准函数,如果将其用于需要特定对齐的类,并且需要手动调用构造函数和析构函数,则需要额外的工作

对于该用例,一个普通C++程序员将使用<代码> STD::vector < /代码> .< i、 e.我可以做到:

void foo(size_t s) {
    uint8_t bar[s]; // `s` not known at compile time
    some_func_that_uses_bar(bar, sizeof(bar));
}
void foo(size_t s) {
    uint8_t bar[s]; // `s` not known at compile time
    some_func_that_uses_bar(bar, sizeof(bar));
}
<>不,你不能在C++中这样做。数组的大小必须是编译时常量

我觉得我应该能够用C++ STD::数组以及

来做到这一点。 不,这也不可能使用std::array

如果在编译时数组的大小未知,则必须动态分配它。典型的解决方案是使用向量


如果希望大小较小,一种可能的优化方法是使用自定义向量类型,该类型使用较小的缓冲区优化,以避免在大小未超过编译时定义的限制时进行动态分配。

如果要在堆栈中分配数组,可以从llvm使用。对于较小的大小,它从堆栈开始,然后如果需要使用push_back,它将进入堆内存:

llvm::SmallVector<int, 5> smallVector;
for(int i = 0; i < 5; i++) { 
    smallVector.push_back(i); 
} // No heap allocations have been performed up to this point.
smallVector.push_back(6); // heap allocation now
llvm::SmallVector SmallVector;
对于(int i=0;i<5;i++){
小向量。推回(i);
}//到目前为止,尚未执行堆分配。
smallVector.push_back(6);//现在进行堆分配

中数组的大小是一个模板参数。模板是编译时唯一的东西。你需要的是一个替代的(特别是考虑到它不是C++的一部分)。还值得注意的是,在你的例子中,这种动态数组分配只在C中被标准化,在C++中,尽管有些编译器支持它,但它是非标准的。在堆栈上分配大型阵列会降低性能,因为堆栈顶部已移出热区域。您知道
s
的最大值吗?如果是这样的话(如果你真的一心想把它放在堆栈上),你总是可以使用这个最大值作为数组大小。如果不知道最大值,如何确保不会出现堆栈溢出?另请参阅。谢谢。RE:“一个普通的C++程序员使用STD::vector”,我分配的缓冲区很小,我想我更喜欢使用C型数组分配和STD::StrimuVIEW。对于一个很小的缓冲区,一个普通的C++程序员会使用<代码> STD::向量< /代码>。一个真正好的处理器可能会使用分析器来确定堆分配的性能影响是否会对实际性能产生不可接受的影响。一个坏的人会认为这是不可接受的,没有实际的分析。为什么要使用非标准alloca,而可以使用非标准VLA呢?分析是摆在桌面上的。我的“有根据的猜测”告诉我,对于小数组,在堆栈上分配更快,因此我不明白为什么一个普通的程序员不会从那里开始。@PeterJankuliak,因为它使代码不那么优雅,更难理解。这使得调试更加困难,并且使崩溃更难诊断。虽然堆栈分配有时比堆分配快,但如果您认为此分配将显著影响代码的性能,则几乎肯定是错误的。