深入記憶體模型和函式呼叫機制,理解析構函式的執行順序

2021-07-13 01:48:02 字數 674 閱讀 2198

為什麼析構函式的執行順序是相反的。

要搞清楚這個問題,首先要明白c++記憶體模型,也就是c++的**和資料在記憶體中是如何儲存的。c++記憶體模型和c語言類似(有部分細節不同),你可以參照c語言記憶體模型來理解。

在記憶體模型中有一塊區域叫做棧區,它是由系統維護的(程式設計師無法操作),用來儲存函式的引數、區域性變數等,類似於資料結構中的棧,也是先進後出。

當遇到函式呼叫時,首先將下一條指令的位址壓入棧區,然後將函式引數壓入棧區,隨著函式的執行,再將區域性變數(或物件)按順序壓入棧區。

棧區是先進後出的結構,當函式執行結束後,先把最後壓入的變數(或物件)彈出,以此類推,最後把第乙個壓入的變數彈出。接下來,再按照先進後出的規則彈出函式引數,彈出下一條指令位址。有了下一條指令的位址,函式呼叫結束後才能夠繼續執行後面的**。

所謂彈出變數,就是銷毀變數,清空變數所占用的資源。如果這個變數是乙個物件,那麼就會執行析構函式。

上節例子中,三個物件入棧的順序依次是 stu1、stu2、stu3,出棧(銷毀)的順序依次是 stu3、stu2、stu1,如下圖所示:

它們對應的析構函式的執行順序也就一目了然了。

main() 函式沒有引數,所以只有下一條指令的位址和區域性變數入棧。

C 深入(記憶體模型)

為什麼有資料型別?現實生活中的資料太多而且大小形態不一。資料型別與記憶體的關係 資料型別的本質 建立變數的模具,是固定大小的別名。include stdio.h include stdlib.h include string.h int main 問題 b,b所代表的資料型別不一樣 b代表的是陣列首...

深入理解共享記憶體機制

共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。是針對其他通訊機制執行效率較低而設計的。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某...

理解JMM記憶體模型與深入Volatile關鍵字原理

一段 如下,執行緒a和執行緒b共享變數initflag。執行緒b先執行,執行緒a後執行。隨後執行緒a將initflag變為true,儲存這個操作後主記憶體中的initflag也會變為true。但是執行緒b不知道initflag已經被改變了,執行緒b會一直執行不會停下。public class vol...