没有malloc的C编程
C programming without malloc
我必须用 C 为嵌入式设备编写复杂的应用程序。运行时 (libc) 不支持 malloc/calloc/realloc/free 或任何其他类型的动态内存管理。
此类情况的最佳做法是什么?
编辑:
申请很复杂。例如,它应该进行 public 密钥加密。
设备是特定的基于 ARM-M0 的模块。编译器是 C99 模式下的 4.6.0。是裸机(没有OS),64K内存。我不关心便携性。
这取决于您需要实现的应用程序。
评论中已经提到,可以使用全局变量来存储数据。
但是,如果你真的需要一些动态内存分配(你得到了指针的优势,你可以重新分配内存,这在某些数据结构的情况下很有用,比如链表或树)您可以实现自己的内存分配器。只需使用一个足够大的数组,其中包含一些关于已分配内容和未分配内容的元数据,以及一些像 malloc 和朋友一样工作的函数。创建一个足够好的内存分配器并没有那么复杂,但是您必须小心可能发生的一些错误。此外,您还必须处理内存碎片和内存分配特有的各种问题,但通过合理的努力是可行的。
此外,您可以在堆栈上创建整个数据结构,但是您失去了动态内存分配的一些优势。
您可以选择:
避免任何类型的动态内存
实现您自己的 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)相关的一些特定编码规则。
我必须用 C 为嵌入式设备编写复杂的应用程序。运行时 (libc) 不支持 malloc/calloc/realloc/free 或任何其他类型的动态内存管理。
此类情况的最佳做法是什么?
编辑:
申请很复杂。例如,它应该进行 public 密钥加密。 设备是特定的基于 ARM-M0 的模块。编译器是 C99 模式下的 4.6.0。是裸机(没有OS),64K内存。我不关心便携性。
这取决于您需要实现的应用程序。
评论中已经提到,可以使用全局变量来存储数据。
但是,如果你真的需要一些动态内存分配(你得到了指针的优势,你可以重新分配内存,这在某些数据结构的情况下很有用,比如链表或树)您可以实现自己的内存分配器。只需使用一个足够大的数组,其中包含一些关于已分配内容和未分配内容的元数据,以及一些像 malloc 和朋友一样工作的函数。创建一个足够好的内存分配器并没有那么复杂,但是您必须小心可能发生的一些错误。此外,您还必须处理内存碎片和内存分配特有的各种问题,但通过合理的努力是可行的。
此外,您可以在堆栈上创建整个数据结构,但是您失去了动态内存分配的一些优势。
您可以选择:
避免任何类型的动态内存
实现您自己的
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)相关的一些特定编码规则。