【问题标题】:Reducing memory allocation GCC command减少内存分配 GCC 命令
【发布时间】:2012-10-09 11:07:54
【问题描述】:

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

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

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

【问题讨论】:

  • 您应该真正注意平衡malloc()s 与相应的free()s,而不是依赖于在内存极低的情况下杀死程序。
  • @H2CO3 我认为我可以很好地跟踪分配的内存,但是在分配太多内存时我需要捕获bad_alloc
  • 您说的是编译期间gcc 编译器使用的内存(您可以使用gcc -ftime-report 来获取),还是编译后的可执行文件使用的内存?
  • @BasileStarynkevitch 可执行文件:)

标签: c++ linux gcc memory-management


【解决方案1】:

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

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

ulimit -d 1024K

【讨论】:

    【解决方案2】:

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

    这完全是 C++,也可以在任何平台上使用任何编译器!

    【讨论】:

    • 我相信这里的问题是关于编译时内存使用,而不是运行时。
    【解决方案3】:

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

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

    或者,您可以考虑使用Boehm's conservative garbage collector。然后,您将使用GC_malloc 代替malloc(或使用new(gc) 代替new),您将不再关心freedelete。但这是一个保守的garbage collector(如果你不走运,可能会留下一些内存泄漏)。

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

    【讨论】:

    • 幸运的是,我没有任何内存泄漏。我只需要在程序启动时(从给定的参数)创建一个巨大的数组,并在我没有足够的内存时正确捕获错误。
    • 在启动程序之前在终端中适当地使用ulimit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多