4

今天,在我的计算机科学课上,有人告诉我,我可以调整程序在编译期间可以分配的内存量(使用 GCC,Linux)。默认情况下,此数量设置为最佳模式(这意味着尽可能多)。

在调试我的应用程序期间,我可以从这个编译器功能中受益匪浅,因为我需要正确处理分配错误,这在我的具有超过 16 GB RAM 的 PC 上是相当棘手的。

有谁知道这个选项是什么?我希望gcc --maxalloc 1024这意味着我的程序最多可以分配 1024 字节的内存。

4

3 回答 3

8

我不知道这个的编译器选项。但是,ulimitLinux 命令可用于限制进程可以使用的内存量。

例如,以下命令将限制从当前 shell 运行的应用程序的数据段大小:

ulimit -d 1024K
于 2012-10-18T21:30:25.683 回答
2

The simplest way is to overload global new/delete operator and limit size of memory that you can allocate.

This is completely C++ and also work on any platform with any compiler!

于 2012-10-18T22:00:47.323 回答
1

你的问题模棱两可。如果你关心编译器gccg++编译器在编译过程中使用的内存资源,你可以通过 using 来衡量它们gcc -ftime-report(它报告了各种 GCC 阶段的时间和内存)。您可以降低编译器使用棘手的 GCC 程序参数进行编译所消耗的资源(深入了解 GCC 文档以获取详细信息),或者通过使用与setrlimit(2)系统调用接口的 shell的ulimit内置函数来降低内存限制。正如其他人所建议的那样,您还可以限制可用内存以使用相同的内置命令和系统调用来运行您的程序。bashulimitsetrlimit

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

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

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

于 2012-10-19T05:22:39.787 回答