内存池简易版 c语言

#ifndef X_MEMORY_H

#define X_MEMORY_H
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>

typedef enum
{
    ErrorUnknown,
    NoError,
    ErrorInit
}XMemErrorCode;

#ifdef __cplusplus
extern "C" {
#endif

    int initMemory(int size);

    void* xmalloc(int size);

    void xfree(void* data);

#ifdef __cplusplus
}
#endif

#endif
#include "xmemory.h"

typedef struct
{
    void* pre;
    void* next;
    int size;
}stBlock;

static stBlock* head = NULL;

int initMemory(int size)
{
    stBlock* tail = NULL;
    char* memhead = (char*)malloc(size);
    if(NULL == memhead)
        return ErrorInit;
    memset(memhead, 0, size);
    head = (stBlock*)memhead;
    head->pre = NULL;
    head->next = memhead + size - sizeof(stBlock);
    head->size = 0;

    tail = head->next;
    tail->pre = head;
    tail->next = NULL;
    tail->size = 0;

    return NoError;
}

void* xmalloc(int size)
{
    stBlock* blk = head;
    stBlock* nblk = NULL;
    stBlock* tmpblk = NULL;
    char* ret = NULL;
    int ntry = 1;
    do
    {
        int validsize = (char*)blk->next - (char*)blk - sizeof(stBlock)*2 - blk->size;
        if(validsize >= size){

            nblk = (stBlock*)((char*)blk+sizeof(stBlock)+blk->size);

            nblk->size = size;
            nblk->next = blk->next;
            nblk->pre = blk;

            blk->next = nblk;
            break;
        }else{
            blk = blk->next;
        }

    } while (blk->next);
    if (NULL == nblk)
    {
        return NULL;
    }
    ret = (char*)nblk+sizeof(stBlock);
    memset(ret, 0, size);

    return ret;
}

void xfree(void* data)
{
    stBlock* blk = head;
    stBlock* preblk = NULL;
    do
    {
        if ((char*)blk+sizeof(stBlock) == data)
        {
            preblk = blk->pre;
            preblk->next = blk->next;
            break;
        }else
        {
            blk = blk->next;
        }
    } while (blk);
}

原文地址:https://www.cnblogs.com/larkin/p/8342887.html

时间: 2024-10-21 23:56:45

内存池简易版 c语言的相关文章

简易版C语言程序语法

<程序> -〉 <外部声明> | <函数定义><外部声明> -〉<头文件> | <变量> | <结构体> <头文件> -〉 #include<文件名><文件名> -〉 stdio.h丨stdlib.h丨string.h<结构体> -〉 <结构体声明〉|<结构体成员列表><结构体声明> -〉 struct<结构名><结构体成员列表

使用 LinkedBlockingQueue 实现简易版线程池

前一阵子在做联系人的导入功能,使用POI组件解析Excel文件后获取到联系人列表,校验之后批量导入.单从技术层面来说,导入操作通常情况下是一个比较耗时的操作,而且如果联系人达到几万.几十万级别,必须拆分成为子任务来执行.综上,可以使用线程池来解决问题.技术选型上,没有采用已有的 ThreadPoolExecutor 框架,而使用了自制的简易版线程池.该简易版的线程池,其实也是一个简易版的[生产者-消费者]模型,任务的加入就像是生产的过程,任务的处理就像是消费的过程.我们在这里不去讨论方案的合理性

一个简易内存池(C++)

做这个内存池主要是为了完成一道面试题,题目在代码中. 代码 1 #include <iostream> 2 #include<string> 3 #include <list> 4 using namespace std; 5 6 //一个简单的内存池,池中保存3块内存分别为1k,2k,4k 7 //实现池子的malloc(size)和free(void*)操作 8 //不考虑跨块申请内存情况 9 10 class node 11 { 12 public: 13 int

Linux简易APR内存池学习笔记(带源码和实例)

先给个内存池的实现代码,里面带有个应用小例子和画的流程图,方便了解运行原理,代码 GCC 编译可用.可以自己上网下APR源码,参考代码下载链接: http://pan.baidu.com/s/1hq6A20G 贴两个之前学习的时候参考的文章地址,大家可以参考: http://www.cnblogs.com/bangerlee/archive/2011/09/01/2161437.html http://blog.csdn.net/flyingfalcon/article/details/2627

基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): 1.实现基本通信框架,包括对游戏的需求分析.设计及开发环境和通信框架的搭建: 2.实现网络底层操作,包括创建线程池.序列化网络包等: 3.实战演练,实现类似于CS反恐精英的3D对战网络游戏: 技术要点:C++面向对象思想.网络编程.Qt界面开发.Qt控件知识.Boost智能指针.STL算法.STL.

[原创]loki库之内存池SmallObj

loki库之内存池SmallObj 介绍 loki库的内存池实现主要在文件smallobj中,顾名思义它的优势主要在小对象的分配与释放上,loki库是基于策略的方法实现的,简单的说就是把某个类通过模板参数传递给主类,比如某个对象的创建可以通过不同的创建策略进行创建,本文主要讲loki的大致实现. smallobj层次 loki.smallobj主要分四层: 应用层smallobject,重载了operator new 和operator delete,内存通过底层获取 内存分配smallobjA

内存池设计与实现

转自:内存池设计与实现 1. 内存池设计 1.1 目的 在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中. 1.2 要求 尽量减少内存碎片,平均效率高于C语言的malloc和free. 1.3 设计思路 将buffer分为四部分,第1部分是mem_pool结构体:第2部分是内存映射表:第3部分是内存chunk结构体缓冲区:第4部分是实际可分配的内存区.整个buffer结构图如图1所示: 图1 内存buffer结构图 第1部

【转】内存池设计与实现

1. 内存池设计 1.1 目的 在给定的内存buffer上建立内存管理机制,根据用户需求从该buffer上分配内存或者将已经分配的内存释放回buffer中. 1.2 要求 尽量减少内存碎片,平均效率高于C语言的malloc和free. 1.3 设计思路 将buffer分为四部分,第1部分是mem_pool结构体:第2部分是内存映射表:第3部分是内存chunk结构体缓冲区:第4部分是实际可分配的内存区.整个buffer结构图如图1所示: 图1 内存buffer结构图 第1部分的作用是可以通过该me

简易版的堆的写法

个人认为重点写出max_heapify和parent_heapify两个函数即可,这个版本内存管理的功能显得特别简单: #include<iostream> #include<stdio.h> using namespace std; class Heap { public: int size, capacity; int *ele; void max_heapify(int i,int heap[],int len){//数组从0开始 int l,r,largest; l=2*i