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大量使用会造成内存碎片,这种碎片形成的机理如下: 内存碎片一般是由于空闲的内存空间比要连续申请的空 ...
随机推荐
- 【DevCloud · 敏捷智库】如何拆分用户故事
提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但很多人面临的问题是拿到一个较大的用户故事时,该如何拆分才能 ...
- Django之ORM执行原生sql语句
django中的ORM提供的操作功能有限,在模型提供的查询API不能满足实际工作需要时,可以在ORM中直接执行原生sql语句. Django 提供两种方法使用原生SQL进行查询:一种是使用raw()方 ...
- Crystal | 水晶方法的七大特征,你了解吗?
本文摘自敏捷开发 20世纪90年代末,Alistair Cockburn提出水晶方法论. 自2001年的敏捷宣言提出以来,以极限编程为首的一系列敏捷方法逐渐走入大众视野,其中就包括水晶方法(Cryst ...
- CF808E Selling Souvenirs
题目链接: http://codeforces.com/contest/808/problem/E 题目大意: Petya 有 n 个纪念品,他能带的最大的重量为 m,各个纪念品的重量为 wi,花费为 ...
- Mac Chrome浏览器取消自动升级(最新版)
做自动化突然冒出错误:SessionNotCreatedException: session not created: This version of ChromeDriver only suppor ...
- Flutter 使用Navigator进行局部跳转页面
老孟导读:Navigator组件使用的频率不是很高,但在一些场景下非常适用,比如局部表单多页填写.底部导航一直存在,每个tab各自导航场景. Navigator 是管理路由的控件,通常情况下直接使用N ...
- angularjs 路由切换回到顶部
angularjs路由切换 页面不会回到顶部 问题: 在angularjs中 ui-sref或者$state.go(),通过路由切换页面,发现新打开的路由页面仍然停留在上一次的路由页面访问的位置. ...
- Rocket - util - ReduceOthers
https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA 简单介绍ReduceOthers的实现. 1. 基本介绍 输入一组Bool元素 ...
- jchdl - GSL实例 - Mul(无符号数的乘法)
这里实现最原始的阵列乘法,逐位相乘然后加到一起. 参考链接 https://github.com/wjcdx/jchdl/blob/edcc3e098d4f1cb21677e86e87a114 ...
- 【积累】如何优雅关闭SpringBoot Web服务进程
1.使用ps ef查出进程对应的pid. 2.使用kill -15 pid结束进程. 为什么不使用kill -9 pid,个人理解kill -15 pid更优雅,能在结束进程前执行spring容器清理 ...