我一直在阅读 C 中的编码标准,其中大多数不鼓励使用动态内存分配。但在流行的使用中动态内存分配导致。这有什么充分的理由。我问它使用的原因,尽管它具有缺点?这些是我的参考 JPL 标准:http ://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf 10 的幂:http: //spinroot.com/gerard/pdf/P10.pdf
2 回答
在嵌入式系统编程中通常禁止动态内存分配,特别是在安全关键的嵌入式软件中。所有安全关键软件的行业标准都禁止它:MISRA-C、DO178B、IEC 61508、ISO 26262 等。
动态内存分配存在许多众所周知的问题:访问时间缓慢且可能不确定、内存泄漏和堆碎片。
任何类型的程序都不需要这些问题。但是在PC/桌面等编程中,它们被认为是必要的邪恶,主要是因为主流操作系统限制了分配给每个进程的静态进程内存量,如果要存储超出该范围的数据,则必须将其存储在堆。
当直到运行时才知道数据量时,使用动态内存也很方便。然而,已知世界上不存在内存无限的计算机,所以“我想使用完全可变数量的数据,我不知道有多少”是一种无稽之谈。一个合适的软件工程师总是针对最坏的情况进行设计。
特别是在嵌入式系统中,RAM 的数量是有限的,并且错误的后果比弹出的内存不足消息框更可怕,您的程序必须具有 100% 的确定性行为。您无法设计诸如“此程序将在 RAM 用完之前一直运行,然后它会崩溃并烧毁”之类的东西。您不能允许在您的铁路监控系统中存在可变的“x”数量的列车,您必须指定上限并在此之后设计系统。
所以不管上面提到的动态内存的所有问题,你都不想在这类系统中使用动态内存,只是因为它没有任何意义。
出于几乎相同的原因,这些系统也禁止递归。
C 中的动态内存分配位于抽象数学和现实世界工程之间的模糊界限。从数学上讲,您说“将这些数据放入某个内存中”,实际上malloc()
只是给了您“一些内存”,基本上是在假装存在无限量的内存。(在许多现实世界的系统malloc()
中,由于过度使用,实际上确实永远不会失败。)
真正的工程必须面对所有资源的有限性,如果你在处理一个问题时完全知道你有 X 数量的可用内存,那么你必须计划内存的去向。这更加麻烦和具有挑战性,但它也可以带来更好的代码和更好的性能,如果没有其他原因,它会迫使您仔细考虑程序的数据流。
与从不失败的普通台式机相比malloc()
,在频谱的另一端,也有没有复杂内存管理器并且malloc()
基本上“总是失败”的嵌入式机器。如果您能够在没有它的情况下进行编程,那么您就可以为此类平台进行编程。另一方面,如果你的编程风格总是假设魔术内存的无限可用性,那么你会发现在这样的平台上编程非常困难。