在堆栈上分配较小尺寸的矢量对象,在堆上分配较大的矢量对象

时间:2018-09-21 15:58:47

标签: c++ vector heap-memory stack-memory

在实时应用中,例如音频编程中,应避免在回调期间在堆中分配内存,因为执行时间不受限制。确实,如果可执行文件的内存不足,则需要等待操作系统分配新的块,该块可能比下一个回调调用花费的时间更长。我可以将内存存储在堆栈中,例如使用可变长度数组(VLA)或alloca(),但是如果数组太大,则会出现堆栈溢出。

相反,我当时正在考虑使用类似于std::vector的接口定义一个类,但是如果大小小于某个threshold,则在内部使用堆栈,否则使用堆(我更喜欢对某个堆栈溢出可能的无界操作)。对于堆部分,我可以使用std::vectornew / delete。但是堆栈呢? VLA和alloca()超出范围时将被释放。我可以使用什么替代方法?

我可以使用std::array<T, threshold>,但这会浪费内存。我希望我的threshold处于2048的顺序。

1 个答案:

答案 0 :(得分:0)

如果有可能需要将数据存储在堆栈中,并且大小是否大于阈值仅在运行时确定,那么您的类型将必须包含一些足以容纳一些大小阈值的堆栈容器(无论是std :: array还是其他东西),让您担心

  

我可以使用std :: array,但这会浪费内存。   我希望我的阈值大约为2048。

不可避免。我认为这没有任何办法。例如。用类似

的代码
uint32_t N = code_that_determines_size_at_runtime();
ThresholdContainer container(N);

编译器无法知道N是高于还是低于阈值。因此,要使其正常工作,ThresholdContainer的内存布局必须包含用于最大大小阈值的数据的堆栈内存,当N> threshold时,该内存将未被使用并被浪费。 (将堆栈和堆内存与介于两者之间的某个迭代器缝合在一起会很可怕,并且您可能需要连续的内存。)

如果另一方面,在编译时知道大小与阈值的关系,则可以定义一个以大小N为模板的类,如果N