x memory pool c语言 内存池
#ifndef X_MEMORY_H #define X_MEMORY_H #include <stdlib.h> #include <stdio.h> #include <memory.h> typedef enum { ErrorUnknown, NoError, ErrorInit, //无法申请系统内存 ErrorOverBlockSize //超过默认块大小 }XMemErrorCode; #ifdef __cplusplus extern "C" { #endif void* xmalloc(int size, int* code); void xfree(void* data); #ifdef __cplusplus } #endif #endif
#include "xmemory.h" #pragma pack(1) typedef struct { void* pre; void* next; unsigned int size; unsigned char flag; }stBlock; #pragma pack() static stBlock* head = NULL; #define BLOCK_DEFAULT_SIZE 10485760 //1024*1024*10 void xlock() { } void xunlock() { } int remalloc(stBlock* tail) { static unsigned char blockflag = 1; stBlock* temhead = NULL; stBlock* temtaill = NULL; char* nhead = (char*)malloc(BLOCK_DEFAULT_SIZE); if (NULL == nhead) { return ErrorInit; } memset(nhead, 0, BLOCK_DEFAULT_SIZE); temhead = (stBlock*)nhead; temhead->pre = tail; temhead->next = nhead + BLOCK_DEFAULT_SIZE - sizeof(stBlock); temhead->size = 0; temhead->flag = blockflag; temtaill = temhead->next; temtaill->pre = temhead; temtaill->next = NULL; temtaill->size = 0; temtaill->flag = blockflag; if (NULL == tail) { head = temhead; } else { tail->next = temhead; } blockflag++; return NoError; } void* xmalloc(int size, int* code) { stBlock* blk = head; stBlock* nblk = NULL; stBlock* blknext = NULL; char* ret = NULL; if (size >= BLOCK_DEFAULT_SIZE) { if (code){ *code = ErrorOverBlockSize; } return NULL; } xlock(); if (NULL == head) { if(ErrorInit == remalloc(NULL) /*initMemory(BLOCK_DEFAULT_SIZE)*/){ xunlock(); if (code){ *code = ErrorInit; } return NULL; } blk = head; } do { int validsize = (char*)blk->next - (char*)blk - sizeof(stBlock)*2 - blk->size; if(validsize >= size){ nblk = (stBlock*)((char*)blk+sizeof(stBlock)+blk->size); nblk->size = size; nblk->next = blk->next; nblk->pre = blk; nblk->flag = blk->flag; blk->next = nblk; break; }else{ blk = blk->next; if (NULL == blk->next) { if (ErrorInit == remalloc(blk)) { xunlock(); if (code){ *code = ErrorInit; } return NULL; } } blknext = blk->next; if (blk->flag != blknext->flag) { blk = blk->next; } } } while (1); ret = (char*)nblk+sizeof(stBlock); memset(ret, 0, size); xunlock(); if (code){ *code = NoError; } return ret; } void xfree(void* data) { stBlock* blk = head; stBlock* preblk = NULL; xlock(); do { if ((char*)blk+sizeof(stBlock) == data) { preblk = blk->pre; preblk->next = blk->next; break; }else { blk = blk->next; } } while (blk); xunlock(); }
源码地址: https://gitee.com/larkin_xu/xmemory
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!