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

5 c++ unix solaris

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

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

Omn*_*ous 6

对于C++,无论在什么平台上,堆都几乎总是通过根据需要向OS请求更多内存来动态扩展.在某些嵌入式平台或某些非常旧的平台上,这可能不是真的,但是由于环境的性质,您可能非常清楚自己拥有多少堆.

在Unix平台上,这是双重的.甚至大多数Unix嵌入式平台都以这种方式工

在这样工作的平台上,库通常没有任何内部限制,而是依赖操作系统告诉它它不能再有内存.实际上,由于各种原因,您实际上要求的内存多于可用内存,因此可能会发生这种情况.

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

不幸的是,这个限制没有直接说明你可以使用多少堆.内存页面由于mmap调用而分配给进程,用于保存程序代码本身以及进程堆栈.

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

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

因此,简而言之,没有一个典型的尺寸,也没有好的方法来找出它的大小.


Dig*_*oss 5

通过根据需要向操作系统请求更多内存来动态扩展堆。

确切地说,它不是由编译器决定的,而是由库决定的。

在动态语言中使用 GC 固定堆的大小更为典型。在 C 和 C++ 中,向操作系统请求更多内存是一件简单的事情,因为这在您需要时很明显。因此,初始堆大小无关紧要,只是分配库部分的实现决定。