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 = ;
stBlock* temhead = NULL;
stBlock* temtaill = NULL;
char* nhead = (char*)malloc(BLOCK_DEFAULT_SIZE);
if (NULL == nhead)
{
return ErrorInit;
}
memset(nhead, , BLOCK_DEFAULT_SIZE);
temhead = (stBlock*)nhead;
temhead->pre = tail;
temhead->next = nhead + BLOCK_DEFAULT_SIZE - sizeof(stBlock);
temhead->size = ;
temhead->flag = blockflag; temtaill = temhead->next;
temtaill->pre = temhead;
temtaill->next = NULL;
temtaill->size = ;
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)* - 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 ();
ret = (char*)nblk+sizeof(stBlock);
memset(ret, , 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
x memory pool c语言 内存池的更多相关文章
- 不定长内存池之apr_pool
内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1. ...
- linux内存源码分析 - 内存池
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 内存池是用于预先申请一些内存用于备用,当系统内存不足无法从伙伴系统和slab中获取内存时,会从内存池中获取预留的 ...
- nginx源代码分析之内存池实现原理
建议看本文档时结合nginx源代码. 1.1 什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...
- Nginx数据结构之内存池
基本结构 1. ngx_pool_t struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain ...
- nginx源码分析——内存池
内存池的目的就是管理内存,使回收内存可以自动化一些. ngx_palloc.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. * ...
- PythonStudy——Python 内存池机制 (Memory pool mechanism) Pymalloc
Python是如何进行内存管理-内存池机制 Pymalloc Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于对小块内存的申请和释 ...
- 内存管理 - MEMORY POOL
内存池优势: 效率高,频繁的new和delete效率低下 减少内存碎片,反复向系统申请和释放内存会产生大量内存碎片 防止内存泄露 内存池设计思路: 内存池可以根据实际需要,设计成不同的样子.下面是针对 ...
- linux下C语言实现的内存池【转】
转自:http://blog.chinaunix.net/uid-28458801-id-4254501.html 操作系统:ubuntu10.04 前言: 在通信过程中,无法知道将会接收到的 ...
- C语言内存管理(内存池)
C语言可以使用alloc从栈上动态分配内存. 内存碎片 Malloc/free或者new/delete大量使用会造成内存碎片,这种碎片形成的机理如下: 内存碎片一般是由于空闲的内存空间比要连续申请的空 ...
随机推荐
- 系列13 docker asp.net core部署
一.介绍 本篇完整介绍asp.net core web api如何部署到docker容器中,并通过外部访问web api服务.在编写完成dockerfile之后,可以通过docker [image ...
- nginx配置之禁止访问和404错误功能配置
禁止访问功能配置 nginx.conf中的http{}中的server{}的location ..{}中: location / { #拒绝访问,192.168.16.0网段的同学都无法访问 /24是 ...
- 我的excel是2003版本的,里边有sheet1、sheet2两个工作表,当使用GetOleDbSchemaTable获取表Schema时,结果是4个,分别为: sheet1 sheet1$ sheet2 sheet2$
原帖地址:http://bbs.csdn.net/topics/310230098 ---------------------------------------------------------- ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
- 面试官:你说你精通 Docker,那你来详细说说 Dockerfile 吧
接上一篇:30分钟快速上手Docker,看这篇就对了! 一. 带着问题学Dockerfile 1.疑问 我们都知道从远程仓库可以pull一个tomcat等镜像下来,然后docker run启动容器,然 ...
- C#不定长参数
Test(5,6,7,8,9,10); void Test(int sd, params int[] arr)//不定长参数前要加params { for(int i = 0 ; i < arr ...
- Web前端:1、HTML&CSS概述及结构
万维网联盟(World Wide Web Consortium)简称W3C,专门为了定义网页相关的标准而成立,如网页中的HTML.CSS.DOM.HTTP.XML等标准. 根据W3C标准,一个网页主要 ...
- 如何利用Xpath抓取京东网商品信息
前几小编分别利用Python正则表达式和BeautifulSoup爬取了京东网商品信息,今天小编利用Xpath来为大家演示一下如何实现京东商品信息的精准匹配~~ HTML文件其实就是由一组尖括号构成的 ...
- [ES6系列-07]Generator Function: 生成器函数
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs Generator function 生成器函数是E ...
- [安卓基础] 007.管理Activity的生命周期
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...