【问题标题】:implement memory pools in c在c中实现内存池
【发布时间】:2014-05-09 13:16:06
【问题描述】:

我对内存池的实现感到困惑。我创建了一个内存池:

typedef struct POOL
{
  struct POOL *p_next;
  unsigned short size;
  unsigned short used;
}pool;

pool *p;
p=malloc(pool_size+sizeof(pool));
p->size= pool_size;
p->used= 0;

现在我想用block_size把这个内存池分成块,所以

typedef struct BLOCK
{
 unsigned short size;
 struct BLOCK *b_next;
}block;

block *b=NULL;
b=(block *)&p[block_size+sizeof(block)];
b->size=block_size;
memset(b,0,size+sizeof(block));
p->used+=(size+sizeof(block));

现在我想使用块b的内存,所以我只是将它用作

strcpy(b, "hello, world!");

我做得对吗?我该如何解决这个问题?

【问题讨论】:

  • 什么是pool?那是struct吗?
  • 是的,它是一个结构体,包含一些关于池大小、池 id 和指向下一个池的指针的信息。块也是一个结构体。
  • 你需要更多地描述你的结构 & 我希望你知道这一点 - p 这里是一个指针,sizeof(pool) 是指针的大小而不是块的大小 pool 指向,与sizeof(block) 相同。
  • 你想实现什么样的内存池?

标签: c memory pool


【解决方案1】:

在下面

b=(block *)&p[block_size+sizeof(block)];

p 是一个指向pool 的指针,因此当您对其使用数组索引时,偏移量将乘以pool 结构的大小。这可能不是您想要的。你可能想跳过池结构,这只是

p+1

我不知道您打算使用什么策略来分割池标头之后的内存,也不知道您打算如何处理对齐要求,所以我不能说除此之外您还需要什么额外的偏移量。

接下来,您在块结构中填写块大小,然后继续使用memset 擦除整个内容。

因此,在不知道您要实现哪种池分配器的情况下,我能做的最好的就是回答您的实际问题,答案是否定的,您没有正确执行。

【讨论】:

  • 这是我想要做的:如果我有 *p=malloc(1000),我想将内存 p 分成 200 和 300 的块,并获取块的地址和用它。我对如何实现它感到困惑。
  • 尝试将您的指针转换为uint8_t*uintptr_t,以便您可以以字节为单位执行算术,然后将它们转换回您真正想要的类型。计算空闲地址时,请记住池和块头。您不想在控制结构之上分配块!
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多