c 記憶體機制

2021-08-14 19:52:57 字數 1728 閱讀 7419

首先,來談談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 的時候沒怎麼了解c 的記憶體機制,教科書上竟然沒有!what?老師上課只是提了一下,沒有說的很細,而且時間過去了好長時間,今天面試的時候面試官問我 說一下你對c 記憶體機制的理解!噗,一下慌了,只想起來堆,棧,還有全域性靜態,面試官笑了給我簡單講了一下還。回去之後趕緊仔細查...

C語言記憶體機制

最近有參加一些c c 類的面試,感覺筆試的題目大都偏重於考察基本原理,這對我來說是乙個不小的挑戰 平時學習的時候往往忽視了那些基本原理,急於動手去實踐,結果忽視了靈魂性的東西 今後的學習中,禁忌一味動手寫 要結合理論多思考,多問些為什麼,不然就真成為了 民工了,知其然,知其所以然,才能成為大師 關於...

C語言記憶體機制詳解

對於乙個c語言程式而言,記憶體空間主要由五個部分組成 段 text 資料段 data bss段 bss 堆和棧組成,其中 段,資料段和bss段是編譯的時候由編譯器分配的,而堆和 在上圖中,由編譯器分配的位址空間都是在連線的時候分配的,而執行時分配的空間是在程式執行時由系統分配的 bss段 bss段 ...