首先,來談談c++的5個儲存區:
1.棧:是分配給函式區域性變數的儲存單元,函式結束後,該變數的儲存單元自動釋放,效率高,分配的空間有限。
2.堆:由new建立,由delete釋放的動態記憶體單元。如果使用者不釋放該記憶體,程式結束時,系統會自動**。
3.自由儲存區:由malloc建立,由free釋放的動態記憶體單元,與堆類似。
4.全域性(靜態)儲存去:全域性變數和靜態變數佔一塊記憶體空間。
5.常量儲存區:儲存常量,內容不允許更改。
本文主要是來討論棧和堆的區別,以及深入到c++彙編中來研究。先宣告一下,以下的彙編都只是節選主程式的一塊。
在linux下,編輯程式aaa.cpp,vim aaa.cpp
然後退出儲存
輸入命令
g++ -g -o aaa aaa.cpp
注意必須要引數-g,否則不會有彙編資訊
接著輸入反彙編命令
objdump -s aaa
得到底層的彙編實現
如果熟悉linux下的程式設計,會發現為什麼那麼多大牛喜歡linux,效率很快。在看程式之前,可能會由同學會注意到和windows下的有一些區別,linux下用的彙編型別是at&t,而windows下是intel彙編,兩者之間有些區別,但是c++的記憶體分配基本原理是一樣的。
接下來,我們來仔細看看其記憶體分配。
首先為什麼函式中宣告的區域性變數a,怎麼沒有對應的彙編語句,因為區域性變數的宣告只是規定了變數的型別和名字,並沒由申請儲存空間。
變數b在棧上分配乙個位元組的記憶體:在棧上分配了一塊記憶體,初始化該變數的值。esp是棧頂指標。
變數c是先在棧上分配了乙個指標大小的記憶體,這塊記憶體是用來儲存指標c的,再在堆空間上分配記憶體
變數p是在棧上分配了12*4個位元組的大小,用來儲存陣列指標,再給這些變數對應分配堆記憶體空間。
這是內建資料型別的情況,如果分配的是類物件型別呢?
程式ccc.cpp如下:
對應的匯程式設計序:
還有類的內部成員函式的實現,現在就先不介紹了,看彙編真的是一件很累的事,但是真的是矯正來我之前很多的誤解。不建議初學者來看,會迷失掉。
對於棧上分配類物件的情況,如語句 a a(10)
先在棧上分配對應大小的記憶體,然後再呼叫類的建構函式
在堆上分配類物件記憶體的情況,語句a* b=new a(12);
大致過程是,先在棧上分配乙個指標大小的記憶體用來儲存變數b,然後在堆上分配類大小的記憶體,再呼叫類的建構函式。
以上都是建立物件的過程,以下是釋放記憶體的過程。
delete b;
大致過程是,先呼叫類的析構函式,再將對應的堆疊釋放。下面是具體析構函式。
C C 記憶體分配機制
1.c語言中的記憶體機制 在c語言中,記憶體主要分為如下5個儲存區 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記free了,則會造...
memcached記憶體分配機制
memcached slab allocator分配機制 slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。slab allocation的原理相當簡單,就是將分配的記憶體分割成各種尺寸的塊 chunk 並把尺寸相同的塊分成組 c...
Memcache記憶體分配機制
1.page 頁 為記憶體分配的最小單位 memcached 的記憶體分配以page為單位,預設情況下乙個page是1m,可以通過 i引數在啟動時指定。如果需要申請記憶體時,memcached會劃分出乙個新的page並分配給需要的slab區域。page一旦被分配在重啟前不會被 或者重新分配 2.sl...