新简单内存池

原创 2012年03月24日 21:28:08

#ifndef __MEMORY_POOL_H__
#define __MEMORY_POOL_H__

#include <iostream>
using namespace std;

#ifndef   nullptr
#define   nullptr   (NULL)
#endif

class Memory_Pool
{
private:
    struct Storage
    {
        size_t    index;
        Storage * next;
    };

private:
    Memory_Pool();
    ~Memory_Pool();

private:
    void adjust(size_t & size);

public:
    void * malloc(size_t size);
    void free(void * ptr);

public:
    static Memory_Pool memory_pool;

private:
    enum { POOL_COUNT = 20 };
    Storage * m_pool[POOL_COUNT];
};

#endif
#include <cassert>
#include <cstdlib>
#include "memorypool.h"

Memory_Pool::Memory_Pool()
{
    for (int i = 0; i < POOL_COUNT; ++i) {
        m_pool[i] = nullptr;
    }
}

Memory_Pool::~Memory_Pool()
{
   for (int i = 0; i < POOL_COUNT; ++i) {
        Storage * head = m_pool[i];
        while (head != nullptr) {
            Storage * next = head->next;
            ::free(head);
            head = next;
        }
    }
}

void Memory_Pool::adjust(size_t & size)
{
    size += sizeof(Storage);
    size += 7;
    size >>= 3;
    size <<= 3;
}

void * Memory_Pool::malloc(size_t size)
{
    adjust(size);

    size_t index = ((size >> 3) - 1);
    assert(index >= 0);

    Storage * pstorage = nullptr;
    if (index < POOL_COUNT && nullptr != m_pool[index]) {
        pstorage = m_pool[index];
        m_pool[index] = pstorage->next;
        pstorage->next = nullptr;
        assert(pstorage->index == index);
    }
    else {
        pstorage = (Storage *)::malloc(size); // ::operator new/[](size);
        if (nullptr == pstorage) {
            return nullptr;
        }
        pstorage->index = index;
        pstorage->next = nullptr;
    }

    return (void *)((char *)pstorage + sizeof(Storage));
}

void Memory_Pool::free(void * ptr)
{
    if (nullptr == ptr) {
        return;
    }

    struct Storage * pstorage = 
                     (Storage *)((char *)ptr - sizeof(struct Storage));
    assert(pstorage->index >= 0);
    assert(nullptr == pstorage->next);

    if (pstorage->index >= POOL_COUNT) {
        ::free(pstorage); // ::operator delete/[](pstorage);
    }
    else {
        pstorage->next = m_pool[pstorage->index];
        m_pool[pstorage->index] = pstorage;
    }
}
#include <iostream>
#include <string>
#include "memorypool.h"
using namespace std;

Memory_Pool Memory_Pool::memory_pool;

void * Malloc(size_t size)
{
    char * ptr = (char *)Memory_Pool::memory_pool.malloc(size);
    cout << "new(" << size << "): " << (int)ptr << endl;
    return ptr;
}

void Free(void * ptr)
{
    cout << "delete(" << (int)ptr << ")" << endl;
    Memory_Pool::memory_pool.free(ptr);
}

class NewDelBase
{
public:
    static void * operator new(size_t size)
    {
        return Malloc(size);
    }

    static void operator delete(void * ptr)
    {
        Free(ptr);
    }

    static void * operator new[] (size_t size)
    {
        return Malloc(size);
    }

    static void operator delete[] (void * ptr)
    {
        Free(ptr);
    }
};

class Age
{
public:
    Age(int age=0) : m_age(age)
    {
        cout << "Age()" << endl;
    }

    ~Age()
    {
        cout << "~Age()" << endl;
    }

private:
    int m_age;
};

class Person : public NewDelBase
{
public:
    Person(int age = 0, const char * name = "") : m_age(age), m_name(name)
    {
        cout << "Person()" << endl;
    }

    ~Person()
    {
        cout << "~Person()" << endl;
    }

    void test()
    {
        int    * pi   = new int;
        double * pd   = new double;
        Age    * page = new Age(24);

        *pi = 1;
        *pd = 2.0;

        delete pi;
        delete pd;
        delete page;
    }

private:
    Age    m_age;
    string m_name;
};

void test1()
{
    cout << "test1" << endl;
    int    * pi   = new int;
    double * pd   = new double;
    Age    * page = new Age(24);

    *pi = 1;
    *pd = 2.0;

    delete pi;
    delete pd;
    delete page;
}

void test2()
{
    cout << "test2" << endl;
    int    * pi   = (int *)Malloc(sizeof(int));
    double * pd   = (double *)Malloc(sizeof(double));
    char   * pbuf = (char *)Malloc(sizeof(Age));
    Age    * page = nullptr;

    *pi   = 1;
    *pd   = 2.0;
    page = new (pbuf) Age(24);

    page->~Age();

    Free(pi);
    Free(pd);
    Free(pbuf);
}

int main()
{
    Person * person = new Person(24, "AdwardInk");
    person->test();
    delete person;

    test1();
    test2();

    Person * people = new Person[3];
    delete [] people;

    return 0;
}
objects=test.o memorypool.o
test:$(objects)
	g++ -o test $(objects)

test.o:test.cpp memorypool.h
	g++ -c test.cpp
memorypool.o:memorypool.cpp memorypool.h
	g++ -c memorypool.cpp

rebuild:clean test

clean:
	-rm test $(objects)

相关文章推荐

一个简单内存池的实现

  • 2008年11月03日 17:42
  • 400KB
  • 下载

C++简单内存池代码

  • 2011年08月10日 21:26
  • 3KB
  • 下载

基于一个简单定长内存池的实现方法详解

本文转载自:http://www.jb51.net/article/36502.htm 本篇文章对一个简单定长内存池的实现方法进行了详细的分析介绍。需要的朋友参考下 主要分为 3 个部分,...
  • vgxpm
  • vgxpm
  • 2015年10月23日 17:33
  • 356

简单(易用)的内存池

  • 2011年08月12日 23:01
  • 304KB
  • 下载

简单内存池

  • 2008年04月12日 13:46
  • 1KB
  • 下载

C++实现简单的内存池

没有考虑线程安全,只是简单的实现了内存池 功能:第一次先申请一大片内存,然后分成小块,每次分配给应用程序这小块内存,当内存不够了又继续向系统申请一大片内存 直接晒代码 MemPool.h#...

自己写的简单内存池

  • 2013年02月07日 16:36
  • 3KB
  • 下载

简单内存池实现

#include #include #include #include using namespace std; class MemPool{ struct FreeNode{ st...

C++简单内存池的实现

#ifndef _MEM_POOL_H #define _MEM_POOL_H #include #include #include #include #include using st...

(新)内存池实现方案一

  • 2011年12月01日 22:31
  • 30KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:新简单内存池
举报原因:
原因补充:

(最多只允许输入30个字)