例如:
void a()
{
int bla;
bla = 1;
}
VS
void b()
{
std::unique_ptr<int> bla( new int );
*bla = 1;
}
什么时候被认为是好的做法?什么时候不是吗?或者仅仅是在旁观者眼中?只有在处理大型项目或处理大值项目时才有意义吗?
当然堆稍慢。
答案 0 :(得分:3)
在Windows平台上,默认堆栈限制为~1兆字节,这意味着您肯定应该在堆上放置更大的对象而不是更改默认值(或者更糟无论如何都要执行它并希望最好)。在尝试之前检查您的环境堆栈大小限制。另外:如果你的算法是递归的,请记住你的堆栈限制也会承受压力。因此也要注意你的算法。
需要记住的一点是,堆栈对象将在函数调用结束时被销毁,而堆栈对象(除非您使用智能指针 - ,建议)将不。你应该相应地计划你的选择。根据经验,除了一些例外情况,大型长时间跨越对象应该在堆上。
对于大多数应用程序而言,性能差异也可以忽略不计。由于堆栈分配( premature optimization is the root of all evils 的性能提升很小,因此甚至不考虑构建整个程序。此外,巨大的减速通常来自过多的复制内容(或分配太多次小对象),而不是来自堆栈/堆分配选择。
答案 1 :(得分:0)
如果您不确定(在编译时)所需的内存量,则应首选动态分配(即堆)。否则,请使用堆栈。
另一点:一般来说,堆栈大小比堆大小要小得多。因此,如果需要大量内存(例如,以MB为单位),那么,即使已知大小,最好使用堆。
答案 2 :(得分:0)
使用函数范围变量,您不太可能超出程序堆栈大小。即使你在一个函数中声明了很多C ++对象,它们也必须非常大才能超过堆栈限制。所以我不认为这是你日常编码中必须担心的事情。只要有意义,就将C ++对象和本机类型声明为堆栈变量。如果确实需要使用动态分配,总是使用smart pointer或STL容器进行收集(例如:std::vector
)。
一般来说,当您必须将对象的生命周期延长到声明它的范围之外时(例如:从函数返回一个对象)或者当一个集合的大小(例如一个集合)时,需要动态内存分配。数组,在编译时不知道。否则,您应该更喜欢短寿命/范围对象。