#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. MySQL数据库基础操作语句

    SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,分为3种类型: 1.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储过程,例如CREATE DROP ALTER 2.DM ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 再说Swagger,分组、描述、小绿锁

    在开始本篇正文之前,解决一个 @疯疯过 指出的错误,再次感谢指正. 步骤如下: 删掉.Domain.Shared层中的项目引用,添加nuget依赖包Volo.Abp.Identity.Domain.S ...

  3. 201771010128王玉兰《面向对象程序设计(Java)》课程学习总结

    1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...

  4. LightOJ1197

    题目链接:https://vjudge.net/problem/LightOJ-1197 题目大意: 给你 a 和 b (1 ≤ a ≤ b < 231, b - a ≤ 100000),求出 ...

  5. Web Scraper——轻量数据爬取利器

    日常学习工作中,我们多多少少都会遇到一些数据爬取的需求,比如说写论文时要收集相关课题下的论文列表,运营活动时收集用户评价,竞品分析时收集友商数据. 当我们着手准备收集数据时,面对低效的复制黏贴工作,一 ...

  6. Understanding REST and RESTful APIs

    Understanding REST and RESTful APIs If you've spent any amount of time with modern web development, ...

  7. Node.js躬行记(1)——Buffer、流和EventEmitter

    一.Buffer Buffer是一种Node的内置类型,不需要通过require()函数额外引入.它能读取和写入二进制数据,常用于解析网络数据流.文件等. 1)创建 通过new关键字初始化Buffer ...

  8. Java 泛型与集合

    1.List练习,请用泛型的写法来完成. 已知有一个Worker 类如下: public class Worker  { private int age; private String name; p ...

  9. MySQL性能分析(Explain)

    更多知识,请移步我的小破站:http://hellofriend.top 1. 概述 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查 ...

  10. Python面向对象的特征跟私有属性

     面向对象的三大特征 继成.封装.多态: 继承:一个类可以继承一个或多个类,被继承的类叫做父类,继承的类叫做子类 封装:将数据和方法放在了一个类中就构成了封装 多态:指的一类事物有多重形态,一个抽象类 ...