#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语言 内存池的更多相关文章

  1. 不定长内存池之apr_pool

    内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.      ...

  2. linux内存源码分析 - 内存池

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 内存池是用于预先申请一些内存用于备用,当系统内存不足无法从伙伴系统和slab中获取内存时,会从内存池中获取预留的 ...

  3. nginx源代码分析之内存池实现原理

    建议看本文档时结合nginx源代码. 1.1   什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...

  4. Nginx数据结构之内存池

    基本结构 1. ngx_pool_t struct ngx_pool_s { ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain ...

  5. nginx源码分析——内存池

    内存池的目的就是管理内存,使回收内存可以自动化一些. ngx_palloc.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. * ...

  6. PythonStudy——Python 内存池机制 (Memory pool mechanism) Pymalloc

    Python是如何进行内存管理-内存池机制 Pymalloc Python引用了一个内存池(memory pool)机制,即Pymalloc机制(malloc:n.分配内存),用于对小块内存的申请和释 ...

  7. 内存管理 - MEMORY POOL

    内存池优势: 效率高,频繁的new和delete效率低下 减少内存碎片,反复向系统申请和释放内存会产生大量内存碎片 防止内存泄露 内存池设计思路: 内存池可以根据实际需要,设计成不同的样子.下面是针对 ...

  8. linux下C语言实现的内存池【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4254501.html 操作系统:ubuntu10.04 前言:     在通信过程中,无法知道将会接收到的 ...

  9. C语言内存管理(内存池)

    C语言可以使用alloc从栈上动态分配内存. 内存碎片 Malloc/free或者new/delete大量使用会造成内存碎片,这种碎片形成的机理如下: 内存碎片一般是由于空闲的内存空间比要连续申请的空 ...

随机推荐

  1. 【DevCloud · 敏捷智库】如何拆分用户故事

    提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但很多人面临的问题是拿到一个较大的用户故事时,该如何拆分才能 ...

  2. Django之ORM执行原生sql语句

    django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句. Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方 ...

  3. Crystal | 水晶方法的七大特征,你了解吗?

    本文摘自敏捷开发 20世纪90年代末,Alistair Cockburn提出水晶方法论. 自2001年的敏捷宣言提出以来,以极限编程为首的一系列敏捷方法逐渐走入大众视野,其中就包括水晶方法(Cryst ...

  4. CF808E Selling Souvenirs

    题目链接: http://codeforces.com/contest/808/problem/E 题目大意: Petya 有 n 个纪念品,他能带的最大的重量为 m,各个纪念品的重量为 wi,花费为 ...

  5. Mac Chrome浏览器取消自动升级(最新版)

    做自动化突然冒出错误:SessionNotCreatedException: session not created: This version of ChromeDriver only suppor ...

  6. Flutter 使用Navigator进行局部跳转页面

    老孟导读:Navigator组件使用的频率不是很高,但在一些场景下非常适用,比如局部表单多页填写.底部导航一直存在,每个tab各自导航场景. Navigator 是管理路由的控件,通常情况下直接使用N ...

  7. angularjs 路由切换回到顶部

    angularjs路由切换  页面不会回到顶部 问题: 在angularjs中  ui-sref或者$state.go(),通过路由切换页面,发现新打开的路由页面仍然停留在上一次的路由页面访问的位置. ...

  8. Rocket - util - ReduceOthers

    https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA   简单介绍ReduceOthers的实现.   ​​   1. 基本介绍   输入一组Bool元素 ...

  9. jchdl - GSL实例 - Mul(无符号数的乘法)

      这里实现最原始的阵列乘法,逐位相乘然后加到一起.   参考链接 https://github.com/wjcdx/jchdl/blob/edcc3e098d4f1cb21677e86e87a114 ...

  10. 【积累】如何优雅关闭SpringBoot Web服务进程

    1.使用ps ef查出进程对应的pid. 2.使用kill -15 pid结束进程. 为什么不使用kill -9 pid,个人理解kill -15 pid更优雅,能在结束进程前执行spring容器清理 ...