减少内存分配的GCC命令

5
今天,在我的计算机科学课上,我被告知可以在编译程序时调整程序可以分配的内存量(使用GCC,Linux)。默认情况下,该量设置为最佳模式(即尽可能多)。
在调试应用程序时,我可以大大受益于此编译器功能,因为我需要正确处理分配错误,这在我的PC上非常棘手,因为它具有超过16 GB的RAM。 有人知道这个选项是什么吗? 我期望像gcc --maxalloc 1024这样的东西,这意味着我的程序最多能够分配1024字节的内存。

你应该真正关注平衡malloc()和相应的free(),而不是依赖于程序在极低内存条件下被杀死。 - user529758
@H2CO3 我认为我很好地跟踪了分配的内存,但是当分配太多内存时,我需要捕获“bad_alloc”异常。 - Robin92
2
听起来像是更改堆栈大小 - Steve-o
@BasileStarynkevitch 可执行文件 :) - Robin92
@Steve-o,关于更改堆大小(new/delete)怎么样? - Robin92
显示剩余2条评论
3个回答

8
我不知道有没有针对这个的编译器选项。但是,可以使用Linux命令ulimit来限制进程可以使用的内存量。
例如,以下命令将限制从当前shell运行的应用程序的数据段大小:
ulimit -d 1024K

2

最简单的方法是重载全局的 new/delete 运算符,并限制您可以分配的内存大小。

这完全是C++,并且适用于任何平台和编译器!


我相信这里的问题涉及编译时内存使用,而不是运行时。 - Tim Angus

1

你的问题有些含糊不清。如果你关心在编译过程中 gccg++ 编译器所使用的内存资源,你可以通过使用 gcc -ftime-report 命令来测量它们(该命令会报告各种 GCC 阶段的时间和内存)。你可以通过使用一些巧妙的 GCC 程序参数(详见 GCC 文档)或者通过使用 bash shell 的 ulimit 内置命令来降低编译器消耗的资源,后者接口了 setrlimit(2) 系统调用。正如其他人建议的那样,你也可以使用相同的 ulimit 命令和 setrlimit 系统调用来限制可用内存以运行程序。

但是你可能更关心你的程序所消耗的内存资源。我建议你使用 g++ -Wall -g 进行编译,并首先学习使用 valgrind(和 gdb)来调试内存泄漏。你甚至可以重新定义 mallocfree

或者,您可以考虑使用Boehm的保守垃圾收集器。然后,您将使用GC_malloc而不是malloc(或使用new(gc)而不是new),您将不再关心freedelete。但这是一个保守的垃圾收集器(当您运气不好时可能会留下一些内存泄漏)。

为了更好地了解某个进程使用的地址空间,请使用proc(5)伪文件系统,特别是/proc/1234/maps用于进程1234的映射,或/proc/self/maps用于自己进程的映射。(在终端上运行cat /proc/self/maps以查看该cat命令的内存映射)。还有pmap命令。


幸运的是,我没有任何内存泄漏问题。我只需要在程序启动时创建一个巨大的数组(从给定的参数中),并在没有足够内存时正确地捕获错误即可。 - Robin92
在启动程序之前,请适当使用终端中的 ulimit - Basile Starynkevitch

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