我在基于 arm 的 Linux 设备上运行 C 代码,该设备具有非常小的 RAM 空间 (16MB)。我的代码经常被内核杀死(SIGKILL)并显示“内存不足”消息。我用 Valgrind 运行程序,看起来没有内存泄漏。我也使用 gdb 运行代码,但无法识别代码中的任何错误。我将尝试多次优化我的代码。
一般来说,什么是代码的良好实现实践以最大限度地减少内存使用?
- 一种可能是尽可能多地使用函数(?),但我猜 gcc 已经优化了代码以减少源代码的使用。
- 避免动态内存分配
- 还有什么?
我在基于 arm 的 Linux 设备上运行 C 代码,该设备具有非常小的 RAM 空间 (16MB)。我的代码经常被内核杀死(SIGKILL)并显示“内存不足”消息。我用 Valgrind 运行程序,看起来没有内存泄漏。我也使用 gdb 运行代码,但无法识别代码中的任何错误。我将尝试多次优化我的代码。
一般来说,什么是代码的良好实现实践以最大限度地减少内存使用?
如果您在 Linux 上遇到此类问题,您可以禁用过度使用内存。它将确保所有分配的内存都有物理内存。内核将不太可能杀死您的程序。然后一定要测试所有 malloc 的结果,因为当你没有内存时它们会在某个时候失败。你可以在这里找到更多信息:http ://www.etalabs.net/overcommit.html
您还可以禁用嵌入式系统上的某些程序以释放内存。可能是您在启动时不使用 cron 或不需要六个 TTY。
注意对象的范围。确保在不再需要对象后处理内存释放。我不确定我是否理解您的use functions as much as possible(?)
. 函数需要开销,每次调用都会占用一点额外的内存,因为它必须在调用堆栈上存储一些指针和一些关于方法的信息。因此,虽然这可能有助于保持您的源代码清洁 - 它不会降低您的内存使用量(它可能会增加它)。在 C 语言中两全其美的一种方法是使用inline
函数 - 这向编译器建议它不应该创建一个实际的函数,而应该只是在任何使用它的地方插入该代码块。请记住,高效的代码通常具有更多机器级别的外观(意味着重复、指针以及通常由开发人员管理的数组索引),而不是利用广泛用途、功能丰富的对象。但是,谢天谢地,智能编译器让您不必了解所有优化。但是,在像 c 这样的低级语言中,由于它赋予了您操纵一切的能力,因此您需要小心不要犯下代价高昂的错误。