【发布时间】:2018-08-08 08:20:24
【问题描述】:
我知道本地数组是在堆栈上创建的,并且具有自动存储持续时间,因为当它们所在的函数结束时它们会被销毁。它们必须具有固定的大小:
{
int foo[16];
}
使用运算符new[] 创建的数组具有动态存储持续时间并存储在堆上。它们可以有不同的尺寸。
{
const int size = 16;
int* foo = new int[size];
// do something with foo
delete[] foo;
}
堆栈的大小是固定的,并且对于每个进程都是有限的。
我的问题是: 为了减少堆栈内存消耗,何时从堆栈内存切换到堆内存是否有经验法则?
例子:
-
double a[2]完全合理; -
double a[1000000000]很可能会导致堆栈溢出,如果堆栈大小为1mb
切换到动态分配的合理限制在哪里?
【问题讨论】:
-
非常接近this question 和我的答案
-
经验法则:如果它适合堆栈,则在堆栈上分配它们(局部变量),如果它太大而无法放入堆栈,则动态分配。
-
首先我宁愿推荐
std::array而不是普通数组,或者std::vector而不是你自己的动态分配。然后至于应该开始使用std::vector而不是std::array的“断点”,这实际上取决于用例。 “经验法则”是元素计数器“足够小”,但“足够小”到底有多小,通常不是可以建议的。 -
对于堆栈分配的数组,您需要在编译时知道它的大小。在实践中,数据结构的大小通常要到 runtime 才能知道。 (小缓冲区优化如果您想更深入地研究问题,可能会引起您的兴趣。)
标签: c++ stack stack-overflow heap-memory