22
  • 如何增加 C++ 程序在堆栈/堆上分配的最大内存?

  • 增加计算机的 RAM 会自动增加计算机程序的堆栈/堆内存吗?

4

5 回答 5

9

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

#pragma comment(linker, "/STACK:2000000")
#pragma comment(linker, "/HEAP:2000000")
于 2015-03-23T17:22:40.837 回答
6

第二次编辑:我从您的评论中看到您在 Windows 中工作,因此我在下面的 Unix 答案对您没有太大帮助。但请参阅Determining Stack Space with Visual StudioC/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 中的堆大小限制。但我不相信你可以增加或减少最大尺寸。

于 2012-12-19T02:58:52.597 回答
5

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

  1. 堆分配
  2. 堆栈分配
于 2012-12-19T03:01:44.020 回答
3

进程的堆大小通常受进程可以分配的最大内存限制。堆不需要是连续的(除非您正在执行类似 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。

于 2012-12-19T04:14:10.413 回答
2

我遇到了一些内存问题,默认堆和堆栈保留大小为 1 MB。但是当我将上述属性设置为 2 MB (2000000) 时,它工作正常。

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

  • 打开项目的“属性页”对话框。
  • 单击链接器文件夹。
  • 单击系统属性页。
  • 修改Heap Reserve SizeStack Reserve Size
于 2016-07-05T06:26:48.727 回答