内存池的高效分配算法

jlangtao 2011-08-14 01:13:38
假设已知有一块内存首地址为 ptr, 该块内存的大小为 size, 那么该如何进行分配?


/// <summary>
/// 分配内存
/// </summary>
void *Alloc(size_t _NumBytes)
{
void *ptr = (void *)0x1000;
size_t size = 0x1000;
if (_NumBytes >= size)
{
return NULL; //不足以分配所请求的大小
//因为要留位置记录分配块的大小, 所以_NumBytes == size也不行
}

void *ptr_alloc;
//continue allocating
//这里怎么编写?
return ptr_alloc;
}
...全文
243 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jlangtao 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yangtseriver1020 的回复:]
就把指针移动下不就OK了,随便找个libc的库看下 就明白了
你这都根本不涉及到管理。
[/Quote]

搞笑。想的太简单还是我没表达清楚?额
yangtseriver1020 2011-08-14
  • 打赏
  • 举报
回复
就把指针移动下不就OK了,随便找个libc的库看下 就明白了
你这都根本不涉及到管理。
zzw820626 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jennyvenus 的回复:]
俺习惯就用数组,先分配一个大内存,然后划成小数组,让后续者使用。不分配,也不回收。
[/Quote]
咋回事,我也喜欢这样
  • 打赏
  • 举报
回复
小弟不才,见笑了。

如果你不用表,那就只分配不回收了,分完为止。
如果你想分完后回收,然后再分配。依俺浅薄的知识,还是需要其它一些信息,得有几个表来跟踪这些内存。


/// <summary>
/// 分配内存
/// </summary>
void *Alloc(size_t _NumBytes)
{
static char * pOffset = (char*)ptr; //记录内存分配后,下次再分配的开始位置。
void *ptr = (void *)0x1000;
size_t size = 0x1000;
if (_NumBytes+pOffset >= size)
{
return NULL; //不足以分配所请求的大小
//因为要留位置记录分配块的大小, 所以_NumBytes == size也不行
}

void *ptr_alloc;
//continue allocating
//这里怎么编写?
ptr_alloc = (void*)pOffset;
pOffset += _NumBytes; //下次分配就从pOffset这里开始。
return ptr_alloc;
}

jernymy 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jennyvenus 的回复:]
原来是伪蒋委员长,失敬。
[/Quote]
致敬

之前看过一个
将内存堆上区先划出分配的块
=64byte n块
=128byten块
......
=2K n块
=4K n块
......
=4M n块

判断要分配的大小符合那个就把最接近的那块给它,只需要做标记即可
用户 昵称 2011-08-14
  • 打赏
  • 举报
回复
俺习惯就用数组,先分配一个大内存,然后划成小数组,让后续者使用。不分配,也不回收。
jlangtao 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]
以俺肤浅的知识,光有这两个信息量还不够用,要有一大堆表要维护,这样才能做到动态分配。
[/Quote]

如果不用表呢?不用考虑内存池内部的碎片。谢谢
用户 昵称 2011-08-14
  • 打赏
  • 举报
回复
以俺肤浅的知识,光有这两个信息量还不够用,要有一大堆表要维护,这样才能做到动态分配。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧