首页 文章

C中的内存池管理

提问于
浏览
0

我在C中实现自己的内存池,我遇到的问题是找出* ptr指向的内存块有多少字节(size_t poolSize(void * ptr)) . 代码只是为了展示我所拥有的部分以及问题所在,我知道我必须处理对齐和其他一些事情 . 我也是C的新手,我自学,所以我还在学习指针是如何工作的(我的问题可能是指针) .

#include <stdio.h>
#include <stdlib.h>

typedef struct NODE MemPool;

struct NODE
{
  char * next;
  char * end;
};

MemPool * poolCreate( size_t size )
{
    MemPool * newPool = (MemPool *)malloc( size + sizeof(MemPool) );
    newPool->next = (char*)&newPool[1];
    newPool->end = newPool->next + size;

    return newPool;
}

void * poolAlloc( MemPool *pool, size_t size )
{
    void *result = NULL;

    if( (pool->end - pool->next) < size )
        return NULL;

    result = (void *)pool->next;
    pool->next += size;

    return result;
}

size_t poolSize(void *ptr)
{
    return ((size_t)&ptr);
}

void poolDestroy( MemPool *pool )
{
    free(pool);
}

3 回答

  • 0
    • ptr指向的内存块有多少字节

    不,您没有标准方法从指针本身查找已分配内存的大小 . 当你做 malloc 时,你必须自己跟踪尺寸 . 或者您必须将分配的内存大小存储在另一个变量中 .

  • 1

    不确定代码究竟要做什么,但结果如下:
    1 .

    MemPool * newPool = (MemPool *)malloc( size + sizeof(MemPool) );
    

    分配内存:

    [[ sizeof(MemPool) ][ size ]]
    ^
    |
    newPool
    

    2 .

    newPool->next = (char*)&newPool[1];
    

    将'next'指针设置为已分配内存的[size]部分:

    [[ sizeof(MemPool) ][ size ]]
    ^                   ^
    |                   |
    newPool             newPool->next
    

    3 .

    newPool->end = newPool->next + size;
    

    将'end'指针设置为已分配内存的结尾:

    [[ sizeof(MemPool) ][ size      ]]
    ^                   ^             ^
    |                   |             |
    newPool             newPool->next newPool->end
    

    也许'next'应该指向一些下一个池节点?如果它是一个指向自定义内存的指针,那么它无用到期可能总是计算为:

    ... = newPool + 1;
    

    自定义内存的大小可以计算为:

    ... = newPool->end - (char*)(newPool + 1);
    

    根据

    size_t poolSize(void *ptr)
    

    你无法通过void指针获得内存的大小 . 如果它是指向池节点的一部分的指针,那么可以找到节点的开始:

    MemPool * pool = (MemPool*)(ptr) - 1;
    

    然后使用'end'指针查找目标大小 .

  • 0

    对于初学者来说,这是一个雄心勃勃的项目 . 可能我给出的最好的建议是找到别人写的实现并研究它直到你理解它为止 .

    你的问题的答案需要演员 . 假设 ptr 是指向竞技场块基础的空指针:

    size_t poolSize(void *ptr) {
        MemPool* pool = (MemPool*)ptr;
        return (size_t)(pool->next - (char*)ptr);
    }
    

    希望能帮助到你 .

相关问题