如何增加 C++ 程序在堆栈/堆上分配的最大内存?
增加计算机的 RAM 会自动增加计算机程序的堆栈/堆内存吗?
5 回答
在 Visual C++ 中,您可以使用指令#pragma
。例如:
#pragma comment(linker, "/STACK:2000000")
#pragma comment(linker, "/HEAP:2000000")
第二次编辑:我从您的评论中看到您在 Windows 中工作,因此我在下面的 Unix 答案对您没有太大帮助。但请参阅Determining Stack Space with Visual Studio和C/C++ maximum stack size of program。
Linux 中的堆栈大小经常受到限制。命令 ulimit -s 将给出当前值,以千字节为单位。您可以(通常)更改文件 /etc/security/limits.conf 中的默认值。
您还可以根据权限使用setrlimit()
. 例如,请参阅我对Segmentation fault的回答: Stack allocation in a C program in Ubuntu when bufffer>4M。
对于堆,请参见例如C 中的堆大小限制。但我不相信你可以增加或减少最大尺寸。
进程的堆大小通常受进程可以分配的最大内存限制。堆不需要是连续的(除非您正在执行类似 malloc(1000000000) 的操作),因此堆可以使用大部分可用地址空间。
在 Windows 下,最大进程大小因几个因素而异。
使用 32 位 Windows,32 位进程可以默认分配 2 GB。如果使用 /3GB 开关启动 Windows 并且使用“启用大地址”链接器标志编译进程,则进程可以分配 3 GB。
使用 64 位 Windows,默认情况下 32 位进程可以分配 2 GB。如果进程与“启用大地址”链接,则 64 位 Windows 允许 32 位进程分配 4 GB。
一个 64 位进程(在 64 位 Windows 上)可以分配大约 16,000 GB。
我遇到了一些内存问题,默认堆和堆栈保留大小为 1 MB。但是当我将上述属性设置为 2 MB (2000000) 时,它工作正常。
要在 Visual Studio 开发环境中设置这些属性,请按照以下步骤操作。
- 打开项目的“属性页”对话框。
- 单击链接器文件夹。
- 单击系统属性页。
- 修改
Heap Reserve Size
和Stack Reserve Size
。