Isl*_*afa 4 microcontroller avr arduino avr-gcc atmel
我已经搜索了几天没有任何运气。
堆内存碎片是在微控制器/Arduino 中大量使用 malloc() 和 free() 的结果。
如果使用它们是不可避免的,我如何不时对堆进行碎片整理以确保下一个 malloc() 调用将找到要分配的连续内存?
创建一个固定大小的内存块池。当您需要任何数量的内存时,从池中分配一个块并使用您需要的部分。完成后,将块返回到池中。池永远不会碎片,因为块总是相同的大小。如果有可用的块,那么它们总是合适的大小。有时你只需要几个字节,一秒钟你会认为你在浪费整个大块。但随后您会记住,您正在避免内存碎片,并且您会对此感觉更好。
如果分配的大小差异很大,那么一个固定大小的内存池可能真的太浪费了。然后你可以为小、中、大块制作两个或三个固定大小的内存池。但请确保将块返回到您从中获取它们的同一个池中。
使用队列或链表来组织池中的块。这些块在分配时从队列/列表中删除。当它们被释放时,它们会返回到队列/列表中。