增加C++堆大小

3

有没有办法扩大 C++ 程序的堆大小?在 Android 中,你可以通过在清单文件中将其声明为大型来轻松实现。

当我尝试在堆上分配十亿个数组元素时,我遇到了这个问题。

int main() {
 int size = 1000000000;
 int* nmbr = new int[size];
 return 0;
}

为什么要分配4 GB的内存?在32位计算机上甚至不可能。 - Some programmer dude
@JoachimPileborg - 1) 对学习感兴趣 2) 如果大小非常大,Pager难道不会处理吗? :-) - Björn Hallström
4
将你的代码编译为 x64 或使用一些操作系统API进行大型内存分配。 - Sebastian Hoffmann
运行良好。采用延迟分配的虚拟内存非常便宜。 - stark
2个回答

4

C++本身不知道什么是"heap(堆)"。这是一个实现问题,因此您需要查看编译器的文档。以下是通过谷歌搜索“MSVC堆大小标志”找到的内容:

http://msdn.microsoft.com/en-us/library/f90ybzkh.aspx

引用MSDN页面的话:

/HEAP选项设置堆的大小(以字节为单位)。此选项仅用于构建.exe文件。


“/HEAP”标志与问题无关,它只控制初始大小/预留空间,在最大大小方面没有影响。 - nobody
你不能使用那个选项将初始大小设置得非常大吗?对我来说听起来很相关,@安德鲁。 - Rob Kennedy
1
不必要。堆将根据需要自动增长(最多增长到进程地址空间、运行时库等所限制的限制)。将初始大小设置为较大的值不会改变堆可以变得多大。 - nobody

4
通常堆大小是实现特定的,取决于您正在使用的编译器。请查看文档,大多数提供了更改堆大小的方法。
为了给您一个更普遍的答案:
堆可以是任何大小,您无法将其与计算机内存进行比较。仅因为您的计算机可能有4GB的内存并不意味着每个程序都可以使用那么多。在MS Visual C++中,默认堆大小为1MB,但您的程序在运行时仍会使用比1MB更多的内存。程序消耗的内存还包括操作系统使用的堆栈内存、句柄和线程以及程序代码和其中包含的所有字符串和其他文字。
分配内存的主要问题是如何寻址它。这是x86和x64架构之间的主要差异。在32位Windows操作系统上,您的程序通常只有2GB的虚拟内存可用(或者通过特殊设置可达到3GB)。
您会注意到,即使还有足够的空间,有一天也可能会出现内存不足错误。如果运行时内存过于碎片化,运行时就无法在任何地方放置所请求的数量,并且通常是由频繁的内存泄漏引起的。为避免这种情况,需要大量内存的应用程序将尝试在进行任何实际工作之前将其分配在一个大块中,并具有某种内存管理来处理它们自己的分配(SQL数据库可能会这样做)。这样,他们就能够根据需要重新排列内存中的数据。有各种方法可以做到这一点,在Windows中,您可以使用VirtualAlloc或其他形式的分配。

谢谢你的好回答,但我不明白碎片化是从哪里来的?进程的页面被映射到内存中的帧。只有在最后一个帧上才可能存在(外部)碎片化。 - Björn Hallström
我非常确定你的程序不会因为碎片化而失败,在你的情况下,主要原因是你不能在使用常规堆分配的32位程序中分配约4GB的动态内存。Windows(以及其他操作系统)限制了程序可用的虚拟空间量(通常在32位系统上约为2-3GB)。尝试将“int”数组替换为“char”数组,它可能会起作用,因为它只会分配约1GB的内存。 - Excelcius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接