我知道本地数组是在堆栈上创建的,并且具有自动存储持续时间,因为它们在它们所处的功能结束时被销毁。它们必然具有固定的大小:
{
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
很可能会导致堆栈溢出
切换到动态分配的合理限制在哪里?
答案 0 :(得分:3)
有关堆分配的讨论,请参阅this answer。
切换到动态分配的合理限制在哪里?
在某些情况下,包括:
太大automatic variables。根据经验,我建议避免使用超过几千字节(以及超过一兆字节的call stack)的调用帧。如果您确定您的函数不能递归使用,则可能会增加该限制。在许多小型嵌入式系统中,堆栈更加有限(例如,几千字节),因此您需要限制每个调用帧(例如,只有一百个字节)。顺便说一句,在某些系统上,你可以更多地增加调用堆栈限制(可能达到几千兆字节),但这也是一个系统管理员问题。
非LIFO分配纪律,经常发生。
请注意,即使容器位于堆栈中,大多数C ++标准containers也会在堆中分配数据。例如,vector类型的自动变量,例如本地std::vector<double> autovec;
已分配其数据堆(并在向量为destroyed时释放)。详细了解RAII。