c – 增加堆栈大小的缺点以及堆栈提交和保留之间的差异

我最近遇到了Dinkumware C 11< regex>的Stack Overflow问题.库,到目前为止,我通过将Stack Commit和Stack Reserve大小加倍(我还没有遇到任何问题)来解决这个问题.

但是,我很好奇增加堆栈大小是否有任何缺点,而且,我不完全确定堆栈提交和堆栈保留之间的区别是什么(但是堆栈提交比堆栈小得多)保留).

最佳答案
增加堆栈大小的显而易见的结果是更多的内存使用.由于在大多数情况下堆栈与整体内存相比并不是很大,因此这不是一个大问题.

显然,如果有许多线程使用大堆栈,那么这可能相当于机器中的大量可用内存 – 特别是如果机器首先没有大量内存.

“保留”空间被分配,但实际上并没有实际存在,直到它被“触摸” – 换句话说,物理内存空间没有为堆栈分配 – 只是从虚拟内存映射中取出一些空间用于分配(所以如果你的虚拟空间很紧,因为你的应用程序需要尽可能多的内存,而不是32位环境,那么它可能仍然是一个因素).

“已提交”空间附加了物理内存(它仍然可以交换到磁盘,但在某处,物理内存必须可用).这在一个缺乏整体内存的系统中更是一个因素,而现在这种情况往往不那么常见,机器有几千兆字节的RAM可用.

使用未提交的大保留区域的副作用是应用程序可能导致系统耗尽物理内存,而应用程序无法检测到,因为“错误”只是通过访问内存而发生,但是没有任何可用的物理内存(包括交换空间),因此必须杀死应用程序[或者在Linux OOM杀手的情况下“看起来很有罪”的其他应用程序].

转载注明原文:c – 增加堆栈大小的缺点以及堆栈提交和保留之间的差异 - 代码日志