c++ - 增加 Stack Size 的缺点以及 Stack Commit 和 Reserve 之间的区别

标签 c++ performance c++11 stack

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

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

最佳答案

增加堆栈大小的明显后果是更多的内存使用。由于在大多数情况下堆栈与总内存相比并不大,所以这不是大问题。

显然,如果有许多线程每个都使用大堆栈,那么这可能会占用机器中的大量可用内存 - 特别是如果机器一开始就没有大量内存。

“预留”空间被分配,但在它被“触摸”之前实际上并不存在 - 换句话说,物理内存空间没有分配给这里的堆栈 - 只是从虚拟内存映射中取出的一些空间用于分配(因此,如果您的虚拟空间紧张,因为您的应用程序需要在 32 位环境中获得尽可能多的内存,那么它可能仍然是一个因素)。

“已提交”空间附有物理内存(它仍然可以换出到磁盘,但在某处,物理内存必须可用)。这在整体内存不足的系统中是一个更重要的因素,如今这种情况不太常见,因为机器有数 GB 的 RAM 可用。

使用未提交的大型保留区域的一个副作用是应用程序可能会导致系统用完物理内存,应用程序无法检测到这一点,因为“错误”只是通过访问内存,但没有任何可用的物理内存(包括交换空间),因此必须终止该应用程序 [或在 Linux OOM killer 的情况下“看起来有罪”的其他一些应用程序]。

关于c++ - 增加 Stack Size 的缺点以及 Stack Commit 和 Reserve 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17629735/

相关文章:

c++ - 声明现有原始指针所有权的正确方法

c++开源项目推荐

javascript - 哪个 JS 基准站点是正确的?

linux - 当子进程接触变量元数据时,如何防止内存爆炸?

PHP检查字符串是否为UTF-8的最快方法?

c++ - 推导嵌套模板可变非类型列表的类型

c++ - 使用 lambdas 移动

c++ - 在boost中使用make_shared和allocate_shared?

c++ - 如何使用宏本身的信息重新定义 C++ #define 宏?

c++ - 如何更改一段代码的缩进等?