我最近在Dinkumware C++11 <regex>
库中遇到了堆栈溢出问题,到目前为止,我已经通过将堆栈提交和堆栈保留大小加倍来解决了这个问题(我还没有遇到任何问题)。
然而,我很好奇增加堆栈大小是否有任何缺点,此外,我不完全确定堆栈提交和堆栈保留之间的区别(然而,堆栈提交比堆栈保留小得多)。
增加堆栈大小的明显结果是更多的内存使用。由于在大多数情况下,与整体内存相比,堆栈并不是很大,所以这不是一个大问题。
显然,如果有许多线程每个线程都使用大堆栈,那么这可能相当于机器中的大量可用内存,尤其是当机器一开始并没有大量内存时。
"保留"空间被分配,但在被"触摸"之前并没有实际存在——换句话说,这里没有为堆栈分配物理内存空间,只是从虚拟内存映射中取出一些空间来进行分配(因此,如果您的应用程序在32位环境中需要尽可能多的内存,因此虚拟空间紧张,那么这可能仍然是一个因素)。
"已提交"空间连接了物理内存(它仍然可以交换到磁盘,但在某个地方,物理内存必须可用)。在一个整体内存不足的系统中,这是一个更大的因素,而现在这种情况往往不太常见,因为机器有多GB的RAM可用。
使用未提交的大型保留区域的副作用是,应用程序可能会导致系统耗尽物理内存,而应用程序无法检测到这一点,因为"错误"只是通过访问内存发生的,但没有任何可用的物理内存(包括交换空间),因此应用程序将不得不被杀死[或者在Linux OOM杀手的情况下"看起来有罪"的其他应用程序]。