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