我的想法是写一个内存管理器,一次分配一堆内存,以最大限度地减少malloc和免费通话,我已经尝试过两次写这个,但两次都遇到了对内存进行碎片整理的问题
你可以经常检查一个块是否为空,如果它是空的,则删除它。但是,让我们说你的块每个100字节,首先你分配20个字节的内存,这将创建一个新的100字节块,因为还没有块,然后你分配80个字节,这填充第一个块,然后你分配另外20个字节,这将创建另一个新块,因为第一个块已满,然后你释放第二个分配(80个字节),并留下两个块,其中只使用前20个字节,这意味着你有100个分配的字节可以通过将20个字节从第二个块移动到第一个块并删除第二个块来释放。
这些是我遇到的问题:
在这之后编写自定义内存管理器是否值得?
答案 0 :(得分:1)
在这之后编写自定义内存管理器是否值得?
这是在征求意见,但我会尝试给出一个事实答案。
大多数操作系统和语言支持库附带的内存分配器通常质量非常高,旨在解决您遇到的问题类型(碎片和性能)以及其他问题。它们与通用内存分配器一样好。
如果您的应用程序具有可被利用的特定分配模式,您可以(稍微)做一些比提供的内存分配器更好的操作。这种情况很少见,但通常可以通过制作比通用内存管理器简单得多的东西来利用它。
你无法移动内存
真。大多数现代系统甚至都没有尝试移动内存 - 他们试图避免碎片开始(通常通过聚类类似大小的分配)。
旧系统(没有虚拟内存管理器的系统)有时会使用具有额外间接层的内存管理器。分配器不会返回指向已分配内存的指针,而是返回一个“句柄”,它可以像内存管理器维护的表中的索引一样简单。当用户想要实际访问内存时,他们会“锁定”它。内存管理器可以自由移动未锁定的内存(例如,消除碎片),因为句柄提供了额外的间接级别。
如果我想存储非常低分辨率(64,64)的ARGB图像
,该怎么办?
大多数内存管理器提供一系列大小,因此不会在 n 较小的块之间拆分大量分配。大多数人会对系统分配器进行非常大的分配,在虚拟内存操作系统上,除非进程地址空间过于分散,否则通常可以解决问题。