你什么时候担心堆栈大小?

Tar*_*ila 13 c++

当您使用允许对非常大的对象使用自动分配的语言进行编程时,您何时以及如何担心堆栈大小?关于堆栈大小的推理是否有任何经验法则?

Chr*_*isW 13

当您使用允许您对非常大的对象使用自动分配的语言进行编程时...

如果我想分配一个非常大的对象,那么我可能不会在堆栈上分配它而是包装在堆中auto_ptr(在这种情况下,当它超出范围时它将被释放,就像堆栈驻留对象一样,但不必担心堆栈大小).

...你何时以及如何担心堆栈大小?

我保守地使用堆栈的习惯(例如,在堆上分配大于大约512字节的任何对象),我知道堆栈有多大(例如默认大约一兆字节),因此知道我没有需要担心它.

关于堆栈大小的推理是否有任何经验法则?

  • 非常大的物体可以吹掉堆叠
  • 非常深的递归可以吹掉堆栈
  • 如果有许多线程,并且如果您在有限内存的嵌入式设备上运行,则默认堆栈大小可能太大(占用总内存太多),在这种情况下,您可能希望使用O/S API或链接器选项减少每个线程的堆栈大小.


Jas*_*n S 11

你在微控制器上关心它,你经常必须明确地指定堆栈空间(或者在RAM用于静态分配+任何RAM程序空间之后你得到剩下的东西).


xto*_*ofl 7

你何时开始担心堆栈大小

  • 你团队中的某个人狡猾地发明了一个不断发生的递归函数......
  • 你创建一个线程工厂,并突然需要你曾经需要的十倍的堆栈(每个线程需要一个堆栈=>你拥有的线程越多,给定堆栈大小剩余的可用空间就越少)


Jam*_*mes 6

如果您正在编写一个小小的嵌入式平台,那么您一直担心它,但您也确切地知道它有多大,并且可能有一些有用的工具可用于找到堆栈的高水位标记.

如果你不是,那么在你的程序崩溃之前不要担心:)除非你分配严重的大对象(几十KB),否则它永远不会成为问题.

但请注意,根据定义,堆栈上的对象是临时的.经常构造(并且可能破坏)大型对象可能会导致性能问题 - 因此,如果您有一个大型对象,它可能应该是持久性的并且基于堆的,而不是堆栈大小.


小智 4

我从不担心。如果有堆栈溢出,我很快就会知道。此外,在 C++ 中,实际上很难在堆栈上创建非常大的对象。唯一的方法是:

struct S {
   char big[1000000];
};
Run Code Online (Sandbox Code Playgroud)

但使用 std::string 或 std::vector 可以解决这个问题。

  • 您显然还没有调试嵌入式系统等上的堆栈溢出。有时它们可​​能是最难追踪的错误。在典型的桌面操作系统上,这似乎没什么大不了的,但在其他系统中,您可能直到*之后*您的堆栈被彻底废弃之后才发现它。然后你就不会得到堆栈跟踪,因为堆栈已经被淹没了。可能需要很长时间才能弄清楚它是堆栈溢出。然后查找*如何*以及哪个任务/线程/进程导致它又可能是一项非常令人沮丧的任务。相信我,这是值得担心的。 (7认同)