gpt4 book ai didi

c++ - 基于静态内存的分配器的问题

转载 作者:行者123 更新时间:2023-11-30 03:31:17 24 4
gpt4 key购买 nike

我最近想到了在 C++ 程序中使用静态初始化数组(即“static byte Memory[Size]”)合并内存的想法。分配内存块的过程类似于预先为池调用 malloc。然后我构建了这个分配器,似乎没有问题。除了有限的内存空间之外,这个分配器架构还有什么问题吗?

注意:我保留内存块的方法是创建一个存储大小、指针和邻居的 block 链表。并不是说它对问题很重要。

最佳答案

TI 的 sysbios 实际上为其微 Controller 提供了一个与您描述的类似的实现。他们称此实现为 heapbuf

heapbuf 是一个单独的数组,它被分割成 n 个大小相等的 block 。 heapbuf 还保存指向第一个空 block 的指针,每个空 block 保存指向下一个空元素的指针。

这个特定的实现只能分配恰好那个大小的 block ,但是没有碎片问题。如果您有许多大小大致相同的小对象,它应该提供出色的性能(因为分配的成本是恒定的,只需要您更新指向第一个空 block 的指针)。

但是,您的注释对问题很重要。不同大小的 block 的问题如下:

  • 第一个 block 可能放不下,因此您需要进行列表遍历,直到找到足够大的空地。
  • 以 1k block 为单位分配所有内存后,您决定释放所有内存,现在您有一个包含许多 1k block 空闲 block 的链表,您是否已决定如何以及何时合并它们?

freeRTOS 的开发人员也遇到了这些问题,因此提供了多个堆,采取了不同的折衷方案(例如,速度快,但根本不释放,或者速度慢一点但不合并释放 block ,或者速度慢但合并释放 block ).这里有他们的实现概述:http://www.freertos.org/a00111.html

关于c++ - 基于静态内存的分配器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44324096/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com