今天,在我的计算机sciene课程中,我被告知我可以调整程序在编译期间可以分配的内存量(使用GCC,Linux)。默认情况下,此数量设置为最佳模式(这意味着尽可能多)。
在调试我的应用程序期间,我可以从这个编译器功能中受益匪浅,因为我需要正确处理分配错误,这在我的具有超过16 GB RAM的PC上非常棘手。
有谁知道这个选项是什么?我希望像gcc --maxalloc 1024
那样,这意味着我的程序最多可以分配1024个字节的内存。
答案 0 :(得分:7)
我不知道编译器选项。但是,ulimit
Linux命令可用于限制进程可以使用的内存量。
例如,以下命令将限制从当前shell运行的应用程序的数据段大小:
ulimit -d 1024K
答案 1 :(得分:2)
最简单的方法是重载全局new/delete
运算符并限制可以分配的内存大小。
这完全是C ++,也适用于任何编译器的平台!
答案 2 :(得分:1)
你的问题含糊不清。如果您关心编译期间gcc
或g++
编译器使用的内存资源,则可以使用gcc -ftime-report
(报告各种GCC阶段的时间和内存)来测量它们。您可以使用棘手的GCC程序参数(有关详细信息,请参阅GCC文档)降低编译器所消耗的资源,或者使用ulimit
内置的bash
shell来降低内存限制setrlimit(2)系统调用。valgrind系统调用。正如其他人所建议的那样,您还可以使用相同的ulimit
内置命令和setrlimit
系统调用限制可用内存来运行程序。
但是你可能正在关心程序消耗的内存资源。我建议您使用g++ -Wall -g
进行编译,并首先学会使用Boehm's conservative garbage collector(和gdb
)来调试内存泄漏。您甚至可以重新定义malloc
和free
。
或者,您可以考虑使用garbage collector。然后,您可以使用GC_malloc
代替malloc
(或使用new(gc)
代替new
),您将不再关心free
或{{1 }}。但它是一个保守的proc(5)(当你不走运时可能会留下一些内存泄漏)。
要了解某些进程使用的地址空间,请使用{{3}}伪文件系统,特别是delete
用于进程1234的映射,或/proc/1234/maps
用于映射你自己的过程。 (在终端上运行/proc/self/maps
以查看该cat /proc/self/maps
命令的内存映射。还有cat
命令。