C 程式設計記憶體管理器(記憶體池)

2021-07-10 18:36:06 字數 3816 閱讀 1748

c語言中的標準庫函式malloc、free、calloc和realloc,以及c++中的new、new、delete和delete 操作符,是這兩種語言中記憶體管理的關鍵之處。(注意一下c語言裡面的是函式,在c++裡面是操作符,這個據說在面試裡面被問到過。)

在執行時,malloc和new將向作業系統核心請求記憶體,而free和delete則請求釋放記憶體。這意味著,作業系統必須在每次提出記憶體請求時在使用者空間**和核心**之間進行切換。這種切換直接導致了執行效率的下降。

在vs2012中測試如下**:

#include #include using namespace std;

class complex

private:

double r; //實部

double c; //虛部

};int main(int argc, _tchar* argv)

for (int j=0;j<1000;j++)

}t2 = clock();

cout << t2-t1 << "ms" << endl;

return 0;

}

考慮到vs2010中debug版本和release版本執行效率的差異,分別使用debug模式和release模式編譯執行程式,得到結果:

debug模式下:

release模式下:

release模式下,程式的執行效率是要遠遠高於debug模式的,這是因為debug模式中有很多除錯資訊,而且沒有對程式進行優化。

流程如下:

1、考慮在程式開始執行的時候就去申請一段記憶體空間,我們定義乙個全域性的物件,通過這個物件的建構函式來完成初始記憶體的申請工作。

假設該全域性物件定義如下:

memorymanager gmemorymanager;

2、對我們已經寫好的類進行new,new,delete,delete的過載,是我們在呼叫這些操作符的時候轉而去呼叫上一步中全域性物件,讓該全域性物件給我們提供空間。這樣,改寫上述的complex類:

class complex

//過載new操作符

inline void* operator new(size_t size)

//過載delete操作符

inline void operator delete(void* object)

//過載new操作符

inline void* operator new (size_t size)

//過載delete操作符

inline void operator delete (void* object)

private:

double r; // real part

double c; // complex part

};

那麼,如何來對這個全域性物件進行抽象也就成了目前的焦點問題。從外部呼叫它來看,它應該具有兩個介面,乙個是提供乙個allocate,用於類申請時的空間供給。另乙個就是free,用於外部訪問時候空間的釋放。

從該類的內部來看,它主要的功能應該在於記憶體的申請和釋放。

//設計該介面在此案例中並沒有突出的作用

class imemorymanager

;class memorymanager : public imemorymanager

; void expandpoolsize(); //擴充套件記憶體空間

void cleanup(); //清理記憶體

freestore* freestorehead;

public:

memorymanager()

~memorymanager()

void* allocate(size_t);

void free(void*);

};//程式啟動時,記憶體池預設的空間大小

const int poolsize = 128;

//提供給外部訪問

void* memorymanager::allocate(size_t size)

//提供給外部訪問

void memorymanager::free(void* object)

//內部訪問,擴充記憶體

void memorymanager::expandpoolsize()

head->next = 0;

}//清理記憶體

void memorymanager::cleanup()

}

按照上述**,重新測試最初的那個程式會發現執行時間會大大的縮短。下面兩圖分別是在debug和release模式下測得的結果:

上述過程的完整**如下:

memoty.h

#ifndef __memory_h__

#define __memory_h__

class imemorymanager

;class memorymanager : public imemorymanager

; void expandpoolsize(); //擴充套件記憶體空間

void cleanup(); //清理記憶體

freestore* freestorehead;

public:

memorymanager()

~memorymanager()

void* allocate(size_t);

void free(void*);

};#endif //

memory.cpp

#include using namespace std;

#include "memory.h"

#include "comlpex.h"

//全域性的記憶體管理物件

memorymanager gmemorymanager;

//程式啟動時,記憶體池預設的空間大小

const int poolsize = 128;

//提供給外部訪問

void* memorymanager::allocate(size_t size)

//提供給外部訪問

void memorymanager::free(void* object)

//內部訪問,擴充記憶體

void memorymanager::expandpoolsize()

head->next = 0;

}//清理記憶體

void memorymanager::cleanup()

}

main.cpp

#include #include using namespace std;

#include "memory.h"

#include "comlpex.h"

#include int main()

for (int j = 0; j < 1000; j++)

}t2 = clock();

cout<

C 記憶體管理 記憶體池

很多內容來自於網際網路,如有侵權,請告知。另外,從 收穫很多,在此表示感謝。我們寫程式經常需要 malloc 和 new 一塊記憶體出來,這些記憶體是在堆上進行分配的,在堆上分配的記憶體和在棧上分配的記憶體不同,可以長久的儲存。堆是什麼 可以把你的程序空間 想象成 4g 大小的記憶體 32 為機子上...

C 記憶體管理 記憶體池

引子 一 單獨類記憶體池 classa intget void operator new size t void operator delete void size t private a next static a freestore 指向可用首位址 static const int achunk...

C C 記憶體管理器

c標準庫提供了malloc,free,calloc,realloc,c 標準庫還提供了new,new,delete,delete。這些用來管理記憶體,看起來夠用了,為啥還要自己寫乙個記憶體管理器呢?原因還是從效能考慮 例如malloc和new是出於通用性考慮的,能處理多執行緒情況 multithre...