c++記憶體分配的四個層面 :
四個層面的比較:
記憶體分配與釋放的測試:
void* p1 = malloc(512); //new關鍵字的實現:512 bytes
free
(p1);
complex
* p2 = new complex; //
one object
delete
p2;
void* p3 = ::operator
new(512); //
512 bytes
::operator
delete
(p3);
//以下使用 c++ 標準庫提供的 allocators。
//其介面雖有標準規格,但實現商業並未完全遵守;下面三者形式略同。
#ifdef _msc_ver
//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 3 個 ints.
int* p4 = allocator().allocate(3, (int*)0
); allocator
().deallocate(p4,3
);
#endif
#ifdef __borlandc__
//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 5 個 ints.
int* p4 = allocator().allocate(5
);
allocator
().deallocate(p4,5
);
#endif
#ifdef __gnuc__
//以下兩函式都是 static,可通過全名呼叫之。以下分配 512 bytes.
//void* p4 = alloc::allocate(512);
//alloc::deallocate(p4,512);
//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 7 個 ints.
void* p4 = allocator().allocate(7
); allocator
().deallocate((int*)p4,7
);
//以下兩函式都是 non-static,定要通過 object 呼叫。以下分配 9 個 ints.
void* p5 = __gnu_cxx::__pool_alloc().allocate(9
); __gnu_cxx::__pool_alloc
().deallocate((int*)p5,9
);
#endif
首先new是被編譯器編譯成三步:
com * p = new com(1,2);
等價於 :
void * mem = ::operator new(sizeof(com)); // 記憶體分配
p = static_cast(mem); // 強制型別轉換
p->com::com(1,2); // 構造函式呼叫(自己這麼寫在大部分編譯器上不支援,但是實際上只是編譯器的實現阻止了這麼寫)
我們可以知道 new分配記憶體 是通過 operator new() 函式實現的。
而 operator new() 的函式實現實際上是依靠 malloc 實現的,如下圖 :
operator new() 不斷地迴圈呼叫 malloc(),如若分配記憶體不成功的話。
但實際上還有另乙個操作就是呼叫 _callnewh(size), 這個函式可以由我們重寫。
當malloc也分配不出記憶體時,就會呼叫它,我們可以將其重寫為 : 釋放部分我們認為可以釋放的記憶體,然後下次malloc就能分配到記憶體了。
而 operator new() 還有第二個引數 : 預設為不報錯,如若要報錯可以自己指定。
delete 關鍵字的實現:
如圖所示 : delete 先呼叫其析構函式,然後再使用 operator delete()釋放記憶體,而 operator delete其實只是簡單地呼叫了free()。
C 記憶體管理(一)
1 記憶體分配方式 1 從靜態儲存區域分配。例如使用static 全域性變數。靜態儲存區的資料在程式編譯的時候就已經分配好了,在程式執行期間一直存在,只有在程式推出之後才會釋放。2 在棧上分配。函式內部的區域性變數都是在棧上分配的,在函式階數時儲存空間便被釋放 3 在堆上分配。程式設計師根據自己的需...
C 記憶體管理(一)
1 記憶體分配方式 1 從靜態儲存區域分配。例如使用static 全域性變數。靜態儲存區的資料在程式編譯的時候就已經分配好了,在程式執行期間一直存在,只有在程式推出之後才會釋放。2 在棧上分配。函式內部的區域性變數都是在棧上分配的,在函式階數時儲存空間便被釋放 3 在堆上分配。程式設計師根據自己的需...
C學習筆記 記憶體管理
乙個c語言變數的作用域可以是 塊 作用域,函式作用域或者檔案作用域 塊是 之間的一段 同乙個 塊不可以有重名變數 auto自動變數 一般情況下 塊內部定義的變數都是自動變數 也可以顯示的使用aotu關鍵字 auto int i register暫存器變數 通常變數在記憶體當中,如果能把變數放到cpu...