c++ - 在 UNIX 上分配给 C++ 程序的初始堆大小

标签 c++ unix solaris

通常分配给在基于 UNIX 的操作系统上运行的 C++ 程序的初始堆大小是多少?

如果 g++ 编译器在这方面发挥作用,它是如何决定的?

最佳答案

对于 C++,无论是什么平台,堆几乎总是通过根据需要向操作系统请求更多内存来动态扩展。在一些嵌入式平台或一些非常老的平台上,这可能不是真的,但由于环境的性质,你可能非常清楚你有多少堆。

在 Unix 平台上,这是双重事实。甚至大多数 Unix 嵌入式平台也是这样工作的。

在像这样工作的平台上,库通常没有任何类型的内部限制,而是依赖于操作系统来告诉它它不能再有内存了。尽管出于各种原因,您实际请求的内存比可用内存多,但很可能会发生这种情况。

在大多数 Unix 系统上,一个进程可以拥有的总内存量有一个硬性限制。可以使用 getrlimit 系统调用查询此限制。相关常量是 RLIMIT_AS。此限制控制可分配给进程的最大内存页数,并直接限制可用的堆空间量。

不幸的是,该限制并未直接说明您可以使用多少堆。作为 mmap 调用的结果,内存页面被分配给一个进程,以保存程序代码本身以及进程的堆栈。

此外,如果将物理内存和交换空间加在一起,此限制通常会超过整个系统可用的总内存。所以实际上,在达到此限制之前,您的程序会经常用完内存。

最后,某些版本的 Unix 会过度分配页面。它们允许您分配大量页面,但只有在写入这些页面时才真正为这些页面找到内存。这意味着即使所有内存分配调用都成功,您的程序也可能因内存不足而被终止。这样做的理由是能够分配只会被部分使用的巨大数组。

因此,简而言之,没有典型的尺寸,也没有找到真正尺寸的好方法。

关于c++ - 在 UNIX 上分配给 C++ 程序的初始堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1552751/

相关文章:

c++ - 我应该重载哪个运算符来捕获列表分配?

c++ - 递归调用段错误问题

c++ - 使用 boost::shared_ptr 而不是 boost::optional 的缺点

c - 如何像 ghostscript 一样将 X11 键盘事件路由到标准输入?

linux - 如何使 zsh `run-help` 忽略 `sudo` 并获得有关以下命令的帮助

c++ - 在重载函数的函数参数中使用右值引用会创建太多组合

ruby - 我如何在 Ruby 中使用 (n)curses?

unix - 在 solaris 中使用 ps 看不到完整命令

user-interface - 用于快速开发的 GUI 工具包?

apache - 在 Solaris 上嗅探/捕获 Apache 和 Weblogic 之间的所有流量