带有指针的内存管理

问题描述 投票:0回答:1

我正在开发一个具有三个功能的C库。初始化函数采用(void *)指向内存块的指针。我需要开发功能来从所述块分配和取消分配内存块。这意味着我必须跟踪已分配的内存块的哪些部分以及哪些部分空闲。问题是,我将用来跟踪内存的结构也必须是所述内存块的一部分。我不允许为我的管理结构分配新的内存。

而且我也不知道该怎么做。

当前,我计划将前几百个字节指定为标头空间,并将其余的分成相等大小的帧。我将使用标题空间创建一个数组,该数组将跟踪分配了哪些帧。为此,我需要一种将内存地址转换为long int的方法,以便可以将它们保存到数组中,并且到目前为止我的搜索没有任何结果。

有什么方法可以实现?在这种情况下,没有其他方法可以实现管理结构。

c pointers memory-management
1个回答
1
投票

为此,我需要一种将内存地址转换为long int的方法,这样我就可以将它们保存到数组中,并且到目前为止我的搜索没有任何结果。

有什么方法可以实现?

通常,您不必仅仅为了跟踪它们就将内存地址转换为整数类型。选项包括:

  • 使用给定的内存块中的指针,使用char *执行算术。
  • 从内存中的指针减去内存的基地址(再次为char *,以获得ptrdiff_t类型的偏移量(在<stddef.h>中定义)并使用它们。
  • 将地址转换为整数类型uintptr_t(在<stdint.h>中定义)。与其他选项不同,它具有与实现相关的行为。在常见的C实现中,转换的结果将是一个简单的内存地址,您可以按预期对它进行算术运算。但是,在某些C实现中,结果将更加复杂,因此代码将无法完全移植。

0
投票

听起来最终目标是可以预先分配一个内存池,然后通过您的界面访问它,但是如果我错了,请纠正我。要使它正常工作,需要预先知道一些事项:

  1. 数据管理结构的大小。
  2. 您的内存池的最大大小,以字节为单位。
  3. 可以从池中拉出的块的大小。

我首先给您的内存管理系统一个初始化程序,该初始化程序预先接受最大池大小(以字节为单位)。可以增加该池,以使其被chunk size平均除以得到pool size。知道这一点后,将其除以块大小即可获得所需的数据管理结构的数量。将结构数乘以数据管理结构的大小即可得到管理大小。您的总大小等于池大小加上管理大小。在内存中分配总大小,并跟踪此巨型内存块中管理结构的起始位置以及池的起始位置。

但是,如果块大小是任意的,事情就会变得更加复杂,这意味着它们可能只有一个字节。您不知道将进行多少分配或将进行多少分配,但是我们知道每个分配都需要一个管理结构。这是需要做出设计决策的地方。如果您限制可以随时保留的可能分配数量(例如,返回错误),则可以保持较小的管理规模并根据需要重新使用管理结构。如果您不想限制分配的数量,我们仍然有一个硬限制,因为池的大小是如此之大。您需要为分配的每个块都有一个管理结构。如果要按成千上万个字节分配单个字节,这将不理想。

另一个更合适的选择是双端内存池。您仍然可以预先分配所有内容,但是可以在池的一端(内存不足/左侧)添加内存管理结构。在池的另一端(高内存/右侧),您有池的内存块。如果您的管理结构空间和池空间在分配期间重叠,则会发出内存不足错误。有趣的事实:街机游戏Hydro Thunder使用了类似的内容。

还有基于堆栈的分配器的概念,但我怀疑您会发现它有用,因为它需要以相反的顺序取消分配。

© www.soinside.com 2019 - 2024. All rights reserved.