gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:18 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

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

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com