如何自定義乙個記憶體池?

2021-10-06 16:36:30 字數 2734 閱讀 4089

目錄

我們先寫個簡單的第一版記憶體分配器:

第二版第三版alloctor

第四版alloctor

//推進式單向鍊錶操作

/* 分配24*size個記憶體空間

可以見圖prealloctor

*/ class firstalloctor

~firstalloctor()

std::size_t get()

void showwhereiam()

void* operator new(std::size_t size)

p->next = 0;

}p = freestore;

freestore = freestore->next;

return p;

} void operator delete(void* del, std::size_t)

firstalloctor* next=nullptr;

private:

static firstalloctor* freestore;

static const int screenchunk;

std::size_t i;

}; firstalloctor* firstalloctor::freestore = 0;

const int firstalloctor::screenchunk = 5;

//第二版prealloctor公升級版

class secondalloctor

; union //匿名union,既可以存資料,也可以存下乙個指標,省空間。

; public:

unsigned long getmiles()

char gettype()

void showwhereiam()

void set(unsigned long m, char t)

//截止到這裡就要考慮幾個問題:

//1.多型問題。

//2.省去1次串接操作

//3.用union節省了一次記憶體

static void* operator new(std::size_t size)

secondalloctor* p = headoffreelist;

if (p)

else

static const int block_size;

static secondalloctor* headoffreelist;

private:

}; secondalloctor* secondalloctor::headoffreelist;

const int secondalloctor::block_size = 512;

//第三版,之前的不夠通用,所以就打算改了。

class threealloctor

p->next = nullptr;

}p = freestore;

freestore = freestore->next;

return p;

} void deallocate(void* del,std::size_t size)

private:

struct obj

; obj* freestore = nullptr;

const std::size_t chunk = 5;

}; threealloctor::threealloctor()

threealloctor::~threealloctor()

//第三版的使用者

void threeversion()

class threealloctor_user

void operator delete(void* del, size_t size)

private:

}; threealloctor_user::threealloctor_user():l(0),str("")

threealloctor_user::~threealloctor_user()

threealloctor threealloctor_user::myallocate;

主要也就是加入了巨集定義,對使用者使用提供了方便,提公升了**重用性。

#define declear_pool_allocate()\

protected:\

static threealloctor myallocate;\

public:\

void* operator new(size_t size)\

\ void operator delete(void* del, size_t size)\

#define implement_pool_allocate(class_name)\

threealloctor class_name::myallocate;

//第四版為了提高**重用性,改用巨集定義

//第四版的使用者

void fourversion()

class foo1

~foo1()

{}long l;

std::string str;

declear_pool_allocate()

private:

}; implement_pool_allocate(foo1)

自定義實現記憶體池

記憶體池 1.建立乙個結構體管理記憶體池。2.過載new和delete操作符 3.執行new時,先執行過載new操作符函式 再執行 建構函式 4.執行delete時,先執行虛構函式 再執行 過載delete操作符函式 struct st memorypool st memorypool void u...

如何自定義乙個UIProgressView

viewcontroller.m裡的檔案 import viewcontroller.h import myprogressview.h inte ce viewcontroller end implementation viewcontroller void viewdidload void di...

php 自定義條件,php如何自定義乙個方法

在php中可以通過 function foo arg 1,arg 2,arg n 形式定義乙個方法。使用者自定義函式 乙個函式可由以下的語法來定義 example 1 展示函式用途的偽 function foo arg 1,arg 2,arg n echo example function.n re...