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大量使用会造成内存碎片,这种碎片形成的机理如下: 内存碎片一般是由于空闲的内存空间比要连续申请的空 ...
随机推荐
- HTTP请求格式
HTTP请求格式 URL包含:/index/index2?a=1&b=2:路径和参数都在这里. 请求头部: · content-length表示请求体里面的数据长度: · ...
- intellij tomcat
VMOption -server -XX:PermSize=128M -XX:MaxPermSize=256m
- poj1966枚举源汇点 求最小点割DInic
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4854 Accepted: 2241 ...
- POJ3436
题目链接:http://poj.org/problem?id=3436 题目大意: 一台电脑可以分成P个部分,在生产过程中,半成品电脑有的部分已经完成(记为1),而有的部分还没有完成(记为0).电脑生 ...
- Security8:权限模拟
用户可以模拟其他用户或登陆的权限来执行查询,并且在查看用户和登录的权限时,结果会受到模拟上下文的影响.当执行EXECUTE AS命令时,原始用户的安全上下文会进行切换,除了ORIGINAL_LOGIN ...
- Mac下搭建atx2环境
Git-atx2官网地址,默认已有python3环境 1.安装rethinkdb 安装db:mac上安装很简单,执行brew install rethinkdb 启动db:nohup rethinkd ...
- [wordpress使用]002_主题
使用WordPress作为博客内容管理系统有一个很大的好处是,WordPress拥有大量的优秀的免费模板.你所需要的是下载安装,和稍作修改.下面接着开始WordPress教程:WordPress主题 ...
- MvvmLight + Microsoft.Extensions.DependencyInjection + WpfApp(.NetCore3.1)
git clone MvvmLight失败,破网络, 就没有直接修改源码的方式来使用了 Nuget安装MvvmLightLibsStd10 使用GalaSoft.MvvmLight.Command命名 ...
- Java IO(四) InputStream 和 OutputStream
Java IO(四) InputStream 和 OutputStream 一.介绍 InputStream 和 OutputStream 是字节流的超类(父类),都是抽象类,都是通过实例化它们的子类 ...
- 郭盛华:DNS新漏洞可使黑客可以发起大规模DDoS攻击
近日,知名网络黑客安全专家.东方联盟创始人郭盛华微博披露了有关影响DNS协议的新缺陷的详细信息,该缺陷可被利用来发起放大的大规模分布式拒绝服务(DDoS)攻击,以击倒目标网站.该漏洞称为NXNSAtt ...