Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候堆内存优先于堆栈内存_C++_Stack_Stack Overflow_Heap Memory - Fatal编程技术网

C++ 什么时候堆内存优先于堆栈内存

C++ 什么时候堆内存优先于堆栈内存,c++,stack,stack-overflow,heap-memory,C++,Stack,Stack Overflow,Heap Memory,我知道本地阵列是在堆栈上创建的,并且具有自动存储持续时间,因为它们在函数结束时会被销毁。它们必须具有固定的大小: { int foo[16]; } 使用操作符new[]创建的数组具有动态存储持续时间,并存储在堆上。它们可以有不同的尺寸 { const int size = 16; int* foo = new int[size]; // do something with foo delete[] foo; } 堆栈的大小是固定的,每个进程都有限制 我的

我知道本地阵列是在堆栈上创建的,并且具有自动存储持续时间,因为它们在函数结束时会被销毁。它们必须具有固定的大小:

{
   int foo[16];
}
使用操作符
new[]
创建的数组具有动态存储持续时间,并存储在堆上。它们可以有不同的尺寸

{
    const int size = 16;
    int* foo = new int[size];
    // do something with foo
    delete[] foo;
}
堆栈的大小是固定的,每个进程都有限制

我的问题是: 为了减少堆栈内存消耗,何时从堆栈内存切换到堆内存有经验法则吗?

例如:

  • 双a[2]
    是完全可以实现的
  • 如果堆栈大小为
    1mb
切换到动态分配的合理限制在哪里?

有关堆分配的讨论,请参阅

转向动态分配的合理限制在哪里

在若干情况下,包括:

  • 太大了。根据经验,我建议避免使用超过几千字节(以及超过兆字节)的调用帧。如果您确定您的函数不能递归使用,那么该限制可能会增加。在许多小型嵌入式系统上,堆栈的限制要大得多(例如,限制在几千字节以内),因此您需要对每个调用帧进行更多的限制(例如,限制在一百字节以内)。顺便说一句,在某些系统上,您可以将调用堆栈限制增加更多(可能增加到几GB),但这也是系统管理问题

  • 非后进先出分配原则,这种情况经常发生

<>注意,大多数C++标准在堆中分配数据,即使容器在堆栈上。例如,类型为的自动变量,例如本地
std::vector autovec
已分配其数据堆(并在向量被释放时释放)。阅读更多信息。

有关堆分配的讨论,请参阅

转向动态分配的合理限制在哪里

在若干情况下,包括:

  • 太大了。根据经验,我建议避免使用超过几千字节(以及超过兆字节)的调用帧。如果您确定您的函数不能递归使用,那么该限制可能会增加。在许多小型嵌入式系统上,堆栈的限制要大得多(例如,限制在几千字节以内),因此您需要对每个调用帧进行更多的限制(例如,限制在一百字节以内)。顺便说一句,在某些系统上,您可以将调用堆栈限制增加更多(可能增加到几GB),但这也是系统管理问题

  • 非后进先出分配原则,这种情况经常发生


<>注意,大多数C++标准在堆中分配数据,即使容器在堆栈上。例如,类型为的自动变量,例如本地
std::vector autovec
已分配其数据堆(并在向量被释放时释放)。阅读更多信息。

非常接近我的答案经验法则:如果它适合堆栈,则在堆栈上分配它们(局部变量),如果它太大而无法适应堆栈,则动态分配。首先,我建议不要使用普通数组,也不要使用您自己的动态分配。然后,对于“断点”,我们应该开始使用
std::vector
而不是
std::array
,这实际上取决于用例。“经验法则”是元素计数器“足够小”,但“足够小”的大小通常不是建议的。对于堆栈分配数组,您需要在编译时知道其大小。实际上,数据结构的大小通常直到运行时才知道。(如果您想更深入地研究这个问题,您可能会对小缓冲区优化感兴趣。)非常接近我的答案经验法则:如果它适合堆栈,则在堆栈上分配它们(局部变量),如果它太大而无法适应堆栈,则动态分配。首先,我建议不要使用普通数组,或者代替您自己的动态分配。然后,对于“断点”,我们应该开始使用
std::vector
而不是
std::array
,这实际上取决于用例。“经验法则”是元素计数器“足够小”,但“足够小”的大小通常不是建议的。对于堆栈分配数组,您需要在编译时知道其大小。实际上,数据结构的大小通常直到运行时才知道。(如果您想深入研究这个问题,小型缓冲区优化可能是您感兴趣的。)