我最近遇到了Dinkumware C ++ 11 <regex>
库的Stack Overflow问题,到目前为止,我通过将Stack Commit和Stack Reserve大小加倍来解决它(我还没有遇到任何问题) )。
但是,我很好奇增加堆栈大小是否有任何缺点,而且,我不完全确定堆栈提交和堆栈保留之间的区别是什么(但堆栈提交相当小)比堆栈储备。)
答案 0 :(得分:4)
增加堆栈大小的显而易见的结果是更多的内存使用量。由于在大多数情况下堆栈与整体内存相比并不是很大,所以这不是一个大问题。
显然,如果有许多线程使用大堆栈,那么这可能相当于机器中的大量可用内存 - 特别是如果机器首先没有大量内存。
“保留”空间被分配,但实际上并没有实际存在,直到它被“触摸” - 换句话说,物理内存空间没有为此处的堆栈分配 - 只是从虚拟内存映射中取出的一些空间分配(因此,如果你的虚拟空间紧张,因为你的应用程序需要尽可能多的内存,那么它可能仍然是一个因素)。
“已提交”空间附加了物理内存(它仍然可以交换到磁盘,但在某处,物理内存必须可用)。这在一个缺乏整体内存的系统中更是一个因素,而现在这种情况往往不那么常见,机器有几千兆字节的RAM可用。
使用未提交的大保留区域的副作用是应用程序可能导致系统耗尽物理内存,而应用程序无法检测到该物理内存,因为“错误”仅通过访问内存,但没有任何可用的物理内存(包括交换空间),因此必须杀死应用程序[或者在Linux OOM杀手的情况下“看起来很有罪”的其他应用程序]。