【问题标题】:What are the good implementation practices to minimize RAM consumption什么是最小化 RAM 消耗的良好实施实践
【发布时间】:2013-08-02 14:05:51
【问题描述】:

我在基于 arm 的 Linux 设备上运行 C 代码,该设备的 RAM 空间非常小 (16MB)。我的代码经常被内核杀死(SIGKILL)并显示“内存不足”消息。我用 Valgrind 运行程序,看起来没有内存泄漏。我也使用 gdb 运行代码,但无法识别代码中的任何错误。我会尝试多次优化我的代码。

一般来说,将内存使用量降至最低的代码的良好实施做法是什么?

  • 一个可能是尽可能多地使用函数(?),但我猜 gcc 已经优化了代码以减少源代码的使用。
  • 避免动态内存分配
  • 还有什么?

【问题讨论】:

  • 为什么要避免动态内存分配?只要记住释放他们。它总是崩溃吗?大量函数可能意味着大量帧和大量堆栈空间。你能弄清楚堆栈是否正在死去吗?
  • 避免动态内存分配 -> 你可能会填满你的堆栈空间并得到与动态分配相同的结果。
  • 动态内存分配比隐式堆栈分配效率低,不是吗?
  • @sven“静态”分配比动态分配快是的
  • ssh me@serious_computer program

标签: c performance memory-management ram memory-efficient


【解决方案1】:

注意对象的范围。确保在不再需要对象后处理内存释放。我不确定我是否理解您的use functions as much as possible(?)。函数需要开销,每次调用都会占用一点额外的内存,因为它必须在调用堆栈上存储一些指针和一些关于方法的信息。因此,虽然这可能有助于保持您的源代码清洁 - 它不会降低您的内存使用量(它可能会增加它)。在 C 语言中两全其美的一种方法是使用inline 函数——这向编译器建议它不应该创建一个实际的函数,而只是在使用它的任何地方插入该代码块。请记住,高效的代码通常具有更多机器级别的外观(意味着重复、指针以及通常由开发人员管理的数组索引),而不是利用广泛用途、功能丰富的对象。但是,谢天谢地,智能编译器让您不必了解所有优化。但是,在像 c 这样的低级语言中,由于它为您提供了操纵一切的能力,因此您需要小心不要犯下代价高昂的错误。

【讨论】:

    【解决方案2】:

    如果您在 Linux 上遇到此类问题,您可以禁用过度使用内存。它将确保所有分配的内存都有物理内存。内核将不太可能杀死您的程序。然后一定要测试所有 malloc 的结果,因为当你没有内存时它们会在某个时候失败。你可以在这里找到更多信息:http://www.etalabs.net/overcommit.html

    您还可以禁用嵌入式系统上的某些程序以释放内存。可能是你不使用 cron 或者启动时不需要 6 个 TTY。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      相关资源
      最近更新 更多