简易内存池
在看了侯捷老师的课程后,跟着敲了一下内存池,下面是一个简单的内存池,做一个记录,万一以后用得到呢
此内存池是不带内存释放功能的!
代码
alocator.h
#pragma once
#include <cstdlib>
#define DECLARE_POOL_ALLOC()\
public:\
void* operator new(size_t size) { return myAlloc.allocate(size); }\
void operator delete(void* p) { myAlloc.deallocator(p, 0); }\
protected:\
static allocator myAlloc;
#define IMPLEMENT_POOL_ALLOC(class_name)\
allocator class_name::myAlloc;
class allocator
{
public:
void* allocate(size_t);
void deallocator(void*, size_t);
private:
struct obj
{
struct obj* next;
};
private:
obj* freeStore = nullptr;
const int CHUNK = 5;
};
allocator.cpp
#include "allocator.h"
void allocator::deallocator(void* p, size_t)
{
((obj*)p)->next = freeStore;
freeStore = (obj*)p;
}
void* allocator::allocate(size_t size)
{
obj* p;
if (!freeStore)
{
size_t chunk = CHUNK * size;
freeStore = p = (obj*)malloc(chunk);
for (int i = 0; i < (CHUNK - 1); ++i)
{
p->next = (obj*)((char*)p + size);
p = p->next;
}
p->next = nullptr;
}
else
{
p = freeStore;
freeStore = freeStore->next;
}
return p;
}
main.cpp
#include <iostream>
#include "allocator.h"
class Foo
{
DECLARE_POOL_ALLOC();
public:
long L;
public:
Foo(long l):L(l){}
};
IMPLEMENT_POOL_ALLOC(Foo);
class Goo
{
DECLARE_POOL_ALLOC();
public:
Goo(int _a) :a(_a){}
public:
double a;
long b;
int c;
char d;
};
IMPLEMENT_POOL_ALLOC(Goo);
int main()
{
Foo* f = new Foo(1);
Goo* g = new Goo(2);
delete f;
delete g;
return 0;
}
这里只做记录,不做解释,如果需要知道代码的含义,请看侯捷老师的视频!