////前言////

來了來了,前面的三節都是為這節所做的前置作業呢

先前提到的"地址"與"資料"的概念,也都是為了解釋變數&指標之間的關係喔

那麼,就進入正題吧!!

////////////

1_4_1    

開始進入正題,接下來基本上都是介紹C++的觀念囉

最一開始,簡單的介紹一下stack & heap吧!! 簡而言之,都是暫時存放運行program的資料的記憶體空間,而特別介紹這兩個部份,是因為這算是C/C++的特點,也是使用者在編寫程式時,可以去操控的部份

首先,stack存放著即使在Run-time時也不會改變所需memory大小的資料,例如"int a"或"int b[10]",前者就固定給一個int大小的memory,而後者是給十個int大小的memory,不論程式被怎樣操作,都不會改變這個配置,也因為這個特性,stack中的資料,都是由系統控制著,使用者不需要去釋放空間。在配置時,是由高位址向低位址擴展

相對的,heap就是讓使用者可依每次操作的不同,動態的去配置需要的記憶體空間,但是所配置的空間,就需由使用者執行釋放的動作,否則直到程式結束前,都會存在著。在配置時,與stack相反,由低位址向高位址擴展

* 註: stack與heap記憶體位址分配方向為最初設計的概念,在大多數介紹的網站也都是如此敘述,但是隨著硬體與系統的改進,實際在運作時並不一定會符合這個概念。

威利用同一段程式,以VC2010編譯為優化的x86與x64兩種版本,stack的配置就不相同,x86似乎還有按照此概念,x64就完全相反,因此才去找些論壇的討論求證,有興趣的可以找看看

1_4_2  

stack&heap的簡介就先這樣,配合著實際的code更容易了解,那麼,就來個很簡單很簡單的code囉

stack_0 

首先從main函式的內容看起,第一行的"int a;",表示在這個函式的區間內宣告了一個名為"a"的"int"型別的變數,這邊就可以對應到1-3的概念,變數就是儲存在某個"記憶體位址"的某種"型別"的資料,但是"記憶體位址"在操作上不直覺,並且程式每次執行時,不太可能分配到相同的記憶體空間來使用,因此,宣告這個變數的區間內,建立了"a"mapping到"記憶體位址"的關係,只要在這區間內,都可以使用"a"來獲得存在"記憶體位址"中的資料

若是一離開這個區間,這個mapping關係就會消失,也就是說向下看到變數"d"的宣告,這個"d"的mapping關係就僅存在於最靠近的"{}"之間,因此假設在該括號外加上"int e = d;",就會直接在compile時跳出Error訊息而停止

再來看到變數"b"的宣告,比"a"多了一個"*"符號呢,表示這是一個"指標變數",顧名思義,就是用來儲存"記憶體位址"的變數,可以記錄在stack或heap中的記憶體位址,但是變數本身也是存在stack中的

接著的"func();"就是執行了上方的函式,函式內宣告了一個變數"c"

最後出現了一個新的"{}"所夾住的區間,裡面宣當了一個變數"d" 

1_4_4  

那麼,就以這個簡單的main函式,來說明在stack中情形吧,在這段範例中,除了指標變數"b"與"func()"比較特別外,其它就是按照int型別所需大小(以威利使用的vs2010compiler,配置為4bytes),配置對應的空間

指標變數特別的地方在於,不論它是何種型別的指標,大小都是一樣的,因為只是存放"記憶體位置",也就是在1-3提過的"地址",在64位元的程式中,最大值就是64bits = 8bytes(在32位元則為4bytes),而型別就是提供解讀該"記憶體位置"中記錄資料的方法,不會影響可用"記憶體位置"的多寡

之所以在不同位元的程式會有差異,是因為可以處理的"記憶體位置"長度不一樣,也因此32位元程式最多只能控管4GB左右的記憶體,而64位元理論上可以對1680萬TB的"記憶體位置"定址

1_4_5  

func()的配置就比較不一樣了,在func()中執行的內容並不是直接在main()的stack範圍內展開,而是會跳出main()的stack範圍外,

配置新的stack區間,執行後再回到main()中呼叫func()的位置,所以包含了一些執行與回傳位置的記錄,詳細有點複雜,威利也不是很清楚XD 不過可以確定的是,所需的大小在compile期間就可以確定

1_4_6    

因為這段code並沒有給與變數任何的數值,都只是單純的宣告,所以執行的流程可以很簡單的呈現出

1_4_7_gif  

下一節就要講關於heap的內容了,威利認為是C/C++很重要的概念,也很常運用,多了解概念總是好的XD

這一節就先到這囉,之後大致上每篇的長度就像這樣,不長不短,空閒時看一下剛剛好XD

1_4_8  

////To be continued////

arrow
arrow

    WillieChuang 發表在 痞客邦 留言(0) 人氣()