C 中自定義簡單記憶體配置器

2021-09-10 21:18:51 字數 3423 閱讀 8103

目錄

寫在前面

參考程式

第一版本

第二版本

第三版本

參考文獻

我們在過載的四個函式中不使用malloc,free進行模擬,而是使用記憶體鍊錶的形式,將空閒的記憶體做成鍊錶,每次開闢新記憶體的話,就將鍊錶中的乙個分配出去,如果**的話,析構物件,將記憶體重新放置回煉表中

#ifndef _screen_h_

#define _screen_h_

#include #include using namespace std;

class screen

; int get()

void* operator new(size_t);

void operator delete(void*,size_t);

private:

screen *next;

static screen *freestore;

static const int screenchunk;

private:

int i; //類中的資料

};screen* screen::freestore = 0; //指向後面的乙個

const int screen::screenchunk = 24; //放置24個大小

void *screen::operator new(size_t size)

p = freestore;

freestore = freestore->next;

return p;

}void screen::operator delete(void *p,size_t) //**到單向鍊錶中,否則呼叫系統的釋放函式,free

#endif

在第一版本中,發現有一定 不足之處,類中存在多餘的記憶體開銷,資料和記憶體指標同時存在於類中,並且每個類使用這樣的記憶體分配方式都要增加這樣乙個鍊錶,並且每次都要重寫這樣的函式,**重複度十分高,鑑於第一點,我們優化程式

#ifndef airplane_h_

#define airplane_h_

class airplane

;private:

union;

public:

unsigned long getmiles()

char gettype()

void set(unsigned long m,char t)

public:

static void* operator new(size_t size);

static void operator delete(void* deadobject,size_t size);

private:

static const int block_size; //塊大小

static airplane* headoffreelist; //鍊錶頭部 };

airplane* airplane::headoffreelist;

const int airplane::block_size = 512;

void* airplane::operator new(size_t size)

return p;

}void airplane::operator delete(void* deadobject,size_t size)

//**的資源,放回鍊錶前面

airplane* carcass =

static_cast(deadobject);

carcass->next = headoffreelist;

headoffreelist = carcass; }

#endif

第二版本中只存在指向下乙個節點的記憶體指標,或者乙個airplanerep結構,不存在記憶體浪費的現象,但是第二個版本只解決了第乙個問題,第二個問題並沒有得到解決,那麼就有了第三版本,static allocator

此版本中,我們將分配器做成其中只含有指向下乙個節點的指標的類,如果在其他類中要使用的話,直接部署到類中即可

#ifndef allocator_h_

#define allocator_h_

class _allocator

;public:

void *allocate(size_t); //分配空間,相當於前面的過載operator new函式

void deallocate(void*,size_t);

private:

obj* freestore = nullptr;

const int chunk = 5; //此大小可以根據實際情況而改變

};void* _allocator::allocate(size_t size)

p->next = nullptr;

} p = freestore; //返回的指標

freestore = freestore->next; //指向下乙個空閒的節點

return p;

}void _allocator::deallocate(void* p,size_t)

#endif

當其他類中使用的時候,即類似於這樣

class foo

static void* operator new(size_t size)

static void operator delete(void* pdead,size_t size) };

_allocator foo::myalloc; //初始化靜態物件

測試程式

int main()

for(int i =0 ;i < 23;i ++)

delete p[i];

}

輸出中我們發現,每5個即在乙個記憶體塊中,我們的記憶體過載是正確的

關於c++中記憶體我們不用改侷限在malloc,delete,free,new函式,應該向更深處去進行探索,理解大神的程式,對我們的學習是十分有幫助的。

《c++ primer plus 第五版》

《記憶體管理》 侯捷老老師

C 自定義記憶體 管理

工作中常常需要,將一些資料放到記憶體中處理,有時候資料量好大多達3g的空間。而且自己儲存都是一些指標之類的東西,每次都要new,容器中儲存的量好大,四五百萬個。而且最頭疼的就是 析構的時候要等好久才能釋放掉這個東西。查了好久 發現最流行的就是 空間換時間。說了也慚愧,在學校中沒怎麼學到高深的東西,好...

C 自定義迭代器

讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric range.h 中。下面是 numeric range模板的定義 template class nume...

C 中自定義異常

在寫方法時,是否遇見資料輸入的錯誤呢.如果字串格式不能轉換成整型的什麼.不過處理這些錯誤的異常,net已經都幫我們寫好了.但是如果乙個字串輸入你想判斷他是不是二進位制數.這種異常你會怎麼處理呢,返回乙個錯誤標識嗎?如果你寫的函式是二進位制轉換成十進位制 返回的值是整型.這個錯誤返回值如果標識呢.哈哈...