没有malloc的C编程

C programming without malloc

我必须用 C 为嵌入式设备编写复杂的应用程序。运行时 (libc) 不支持 malloc/calloc/realloc/free 或任何其他类型的动态内存管理。

此类情况的最佳做法是什么?

编辑:

申请很复杂。例如,它应该进行 public 密钥加密。 设备是特定的基于 ARM-M0 的模块。编译器是 C99 模式下的 4.6.0。是裸机(没有OS),64K内存。我不关心便携性。

这取决于您需要实现的应用程序。

  1. 评论中已经提到,可以使用全局变量来存储数据。

  2. 但是,如果你真的需要一些动态内存分配(你得到了指针的优势,你可以重新分配内存,这在某些数据结构的情况下很有用,比如链表或树)您可以实现自己的内存分配器。只需使用一个足够大的数组,其中包含一些关于已分配内容和未分配内容的元数据,以及一些像 malloc 和朋友一样工作的函数。创建一个足够好的内存分配器并没有那么复杂,但是您必须小心可能发生的一些错误。此外,您还必须处理内存碎片和内存分配特有的各种问题,但通过合理的努力是可行的。

  3. 此外,您可以在堆栈上创建整个数据结构,但是您失去了动态内存分配的一些优势。

您可以选择:

  • 避免任何类型的动态内存

  • 实现您自己的 malloc & free(或根据您的需要调整一些现有的 malloc 库)

  • 实施您自己的 garbage collector (I guess that simple mark&sweep could be suitable in your case). Look e.g. into OpenMirage as an example showing that a GC-ed approach could make sense. Read the Gc HandBook 更多。

  • 使用alloca(可能是错的)

  • 使用区域或arena allocation技巧

顺便说一句,(例如密码)算法的复杂性与动态内存管理正交....

请注意,您可以例如自定义您的编译器链(例如使用 MELT if using a recent GCC),例如验证与您的特定内存管理器(或 GC)相关的一些特定编码规则。