流行使用动态内存分配

时间:2014-12-09 08:26:28

标签: c memory coding-style embedded misra

我一直在阅读C语言中的编码标准,但大多数都不鼓励使用动态内存分配。但是在流行的使用中,动态内存分配导致。这有很好的理由。我问它使用的原因尽管它拥有它的缺点? 这些是我的参考 JPL标准:http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf 权力10:http://spinroot.com/gerard/pdf/P10.pdf

2 个答案:

答案 0 :(得分:7)

嵌入式系统编程通常禁止动态内存分配,特别是在安全关键的嵌入式软件中。安全关键软件的所有行业标准都禁止它:MISRA-C,DO178B,IEC 61508,ISO 26262等。

动态内存分配存在许多众所周知的问题:访问速度慢且可能不确定,memory leaksheap fragmentation

在任何类型的计划中都不需要这些问题。但是在PC /桌面等编程中,它们被认为是必然的恶,主要是因为主流操作系统限制了给每个进程的静态进程内存量,如果你想存储超过它的数据,你必须将它存储在堆。

在运行时直到不知道数据量时,使用动态内存也很方便。然而,在已知世界中没有计算机具有无限的内存,因此“我想使用完全可变数量的数据,我不知道多少”是一种无意义的论点。一个合适的软件工程师总是为最坏的情况设计。

特别是在嵌入式系统中,RAM的数量有限,而且错误的后果远比内存不足的消息框弹出严重,  您的程序必须具有100%确定性行为。你无法设计诸如“这个程序在RAM耗尽之前会工作,然后就会崩溃和烧毁”。您不能允许在您的铁路监控系统中存在可变的“x”列车数量,您必须指定上限并在此之后设计系统。

所以无论上面提到的动态内存的所有问题,你都不想要在这类系统中使用动态内存,只是因为它没有任何意义< / em>的

出于同样的原因,这些系统也禁止递归。

答案 1 :(得分:5)

C中的动态内存分配位于抽象数学和现实世界工程之间的模糊界限上。在数学上你说,“把这些数据放在一些内存中”,实际上malloc()只是给你“一些记忆”,基本上假装存在无限量的内存。 (并且在许多真实世界的系统中malloc()实际上从未因为过度评估而失败。)

真正的工程必须面对所有资源的有限性,如果你完全知道你有大量可用的内存,那么必须计划内存的去向。这更加繁琐且具有挑战性,但如果没有其他原因,它会导致更好的代码和更好的性能,这会迫使您仔细考虑程序的数据流。

malloc()永不失败的普通台式机相比,在相反的一端还有嵌入式机器,它们没有复杂的内存管理器,基本上malloc() {{1}} “总是失败”。如果你能够在没有它的情况下进行编程,那么你就可以为这样的平台编程。另一方面,如果您的编程风格总是假设魔术内存的无限可用性,那么您将发现在这样的平台上进行编程非常困难。