如何增加堆栈/堆分配的最大内存

22
1. 如何在C++程序中增加栈/堆的最大内存分配? 2. 增加计算机的RAM是否会自动增加计算机程序的栈/堆内存?

1
我增加内存,是否会自动增加我的堆栈/堆大小? - Computernerd
通常每个内核都对线程和进程施加限制,您可以使用多进程或多线程来使用更多资源。 - user1849534
栈?不是的。栈是预分配的内存。对于堆,您会注意到可以分配更多的动态内存(特别是大块内存)。 - Mark Garcia
2
有意义的回答将取决于您的目标系统和(可能是)您使用的工具链。 - Jerry Coffin
1
添加 RAM 可以提高系统性能,但通常不会影响程序的正确运行。如果你的程序需要比你 RAM 更多的内存,Windows 将会将你程序的一部分移动到交换文件中的磁盘上。 - brian beuning
显示剩余3条评论
5个回答

9

在Visual C++中,您可以使用指示符#pragma。例如:

#pragma comment(linker, "/STACK:2000000")
#pragma comment(linker, "/HEAP:2000000")

默认的堆栈和堆大小都为1 MB。请参见https://msdn.microsoft.com/en-us/library/8cxs58a6.aspx和https://msdn.microsoft.com/en-us/library/f90ybzkh.aspx。 - Andrew

7
第二次编辑:我从您的评论中看到您使用Windows,因此我的Unix答案对您没有太大帮助。但是请参见使用Visual Studio确定堆栈空间C/C++程序的最大堆栈大小
在Linux中,堆栈大小通常是有限制的。命令ulimit -s将给出当前值(以Kbytes为单位)。您可以在(通常是)文件/etc/security/limits.conf中更改默认值。
您还可以根据权限,在每个进程上使用setrlimit()进行更改。例如,请参见我的回答Ubuntu中C程序中堆栈分配错误
对于,请参见例如C中的堆大小限制。但我不认为您可以增加或减少最大大小。

5

您可以使用Visual Studio中的链接选项/Heap和/Stack来指定保留堆大小和堆栈大小。有关详细信息,请查阅以下MSDN文章:

  1. 堆分配
  2. 栈分配

3
一个进程的堆大小通常由进程可以分配的最大内存限制。堆不需要连续(除非你像malloc(1000000000)这样做),因此堆可以使用大部分可用地址空间。
在Windows下,进程的最大大小会受到一些因素的影响。
在32位Windows下,默认情况下,32位进程可以分配2GB。 如果使用/3GB开关启动Windows,并使用“启用大地址”链接器标志编译进程,则进程可以分配3GB。
在64位Windows下,默认情况下,32位进程可以分配2GB。 如果将进程与“启用大地址”链接,则64位Windows允许32位进程分配4GB。
在64位Windows上,64位进程可以分配约16000GB左右。

2

我在使用默认堆和栈保留大小为1MB时遇到了一些内存问题。但当我将以上属性设置为2MB(2000000)时,问题得到了解决。

要在Visual Studio开发环境中设置这些属性,请按照以下步骤进行操作。

  • 打开项目的“属性页面”对话框。
  • 单击链接器文件夹。
  • 单击“系统属性页面”。
  • 修改“堆保留大小”和“栈保留大小”。

设置为8 MB,如此操作。项目文件中读取<StackReserveSize>8000000</StackReserveSize>,但在VS10重新加载项目时该值不会显示。感谢微软。 - Laurie Stearn

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