C++ C++;在哪一点上使用堆而不是堆栈有意义?

C++ C++;在哪一点上使用堆而不是堆栈有意义?,c++,memory-management,heap-memory,stack-memory,C++,Memory Management,Heap Memory,Stack Memory,例如: void a() { int bla; bla = 1; } vs void b() { std::唯一的ptr bla(新int); *bla=1; } 什么时候一个或另一个被认为是良好实践?什么时候不是?或者它只是在旁观者的眼中?它是否只有在处理大型项目或处理大型值时才有意义 当然,堆的速度稍慢。在Windows平台上,默认堆栈限制为~1 MB,这意味着您肯定应该在堆上放置更大的对象,而不是更改默认值(或者更糟的是,无论如何都要这样做,希望达到最佳效果)。在试验

例如:

void a()
{
    int bla;

    bla = 1;
}
vs

void b()
{
std::唯一的ptr bla(新int);
*bla=1;
}
什么时候一个或另一个被认为是良好实践?什么时候不是?或者它只是在旁观者的眼中?它是否只有在处理大型项目或处理大型值时才有意义


当然,堆的速度稍慢。

在Windows平台上,默认堆栈限制为~1 MB,这意味着您肯定应该在堆上放置更大的对象,而不是更改默认值(或者更糟的是,无论如何都要这样做,希望达到最佳效果)。在试验之前,请检查您的环境堆栈大小限制。另外:如果您的算法是递归算法,请记住堆栈限制也会受到压力。因此也要注意你的算法

需要记住的一点是,堆栈对象将在函数调用结束时销毁,而堆对象(除非您使用智能指针-,建议使用)将不会销毁。你应该据此计划你的选择。根据经验,大的长时间跨越对象应该放在堆上,但有一些例外

对于大多数应用程序,性能差异也可以忽略不计。因为堆栈分配的性能增益很小,所以不要考虑构建整个程序。此外,巨大的速度减慢通常来自过度的复制(或分配太多次小对象),而不是真正来自堆栈/堆的分配选择。

当您不确定(在编译时)所需的内存量时,应首选动态分配(即堆)。否则,请使用堆栈


另一点:一般来说,堆栈大小比堆大小小得多。因此,如果需要大量内存(例如,以MB为单位),那么,即使大小已知,也最好使用堆。

使用函数范围的变量,您不太可能超过程序堆栈大小。即使在函数中声明大量C++对象,它们都必须非常大,以超过堆栈限制。所以我不认为这是你在日常编码中需要担心的事情。当它有意义时,将C++对象和本机类型声明为堆栈变量。如果确实需要使用动态分配,请始终为集合使用或STL容器(例如:
std::vector


一般来说,如果必须将对象的生存期延长到声明对象的范围之外(例如:从函数返回对象),或者在编译时不知道集合(如数组)的大小,则需要动态内存分配。否则,您应该更喜欢短期/作用域对象。

请考虑Windows上的堆栈大小默认为1 MB,如果您计划使用更多,您应该选择堆,而不是更改堆栈大小defaults@KugBuBu:否。这是一个询问何时适合使用自动存储(如堆栈)和分配存储(如堆)的问题。您永远不应该使用第二个代码段。如果您想使用堆分配,请使用
std::unique\u ptr
std::unique\u ptr
std::vector
@KugBuBu:您不能使用重复建议工具两次,但您可以留下另一个注释和更好的副本。@deW1无论如何,我发现了一些可能对您有帮助的东西:
void b()
{
    std::unique_ptr<int> bla( new int );

    *bla   = 1;
}