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