無os時,ram的使用可以分為資料、棧和堆區域;有os時,將ram分成若干個段,每個任務分配乙個段,用於各自的資料、棧和堆區域。
區域性變數(local variable)是指作用域和生命週期都侷限在所在函式或過程範圍內的變數,它是相對於全域性變數(global variable)而言的。
編譯器在為區域性變數分配空間時通常有兩種做法:使用暫存器和使用棧。暫存器的訪問速度快,但數量和空間有限,所以像字串或陣列不適合分配在暫存器中。編譯器通常只會把頻繁使用的臨時變數分配在暫存器中,比如for迴圈中的迴圈變數。
棧上的變數會隨著函式的呼叫和返回而自動分配和釋放,所以棧有時也稱為自動記憶體。編譯器在編譯時,會計算當前的**塊中所宣告的所有區域性變數所需要的空間,並將其按照記憶體對齊要求來分配3,一般為4位元組對齊。
x86 cpu中定義了棧指標esp(棧頂)暫存器,和棧基址指標ebp(棧底)暫存器,使用ebp暫存器,函式可以把自己將要使用的棧空間的基準位址記錄下來,然後使用這個基位址來引用區域性變數和引數。在同一函式內,ebp暫存器的值是保持不變的,這樣函式的區域性變數就有了乙個固定的參照物。
通常,乙個函式在入口處將當時的ebp值壓入堆疊1,然後把esp值(棧頂)賦值給ebp2,這樣ebp中的位址就是進入本函式時的棧頂位址。
每個函式在棧中所使用的區域稱為乙個棧幀(stack frame),每發生一次函式呼叫,便產生乙個新的棧幀,當乙個函式返回時,這個函式所對應的棧幀被清除。
shell指令碼中區域性變數
在shell中定義函式可以使 模組化,便於復用 不過指令碼本身的變數和函式的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方為止。例1 指令碼變數的作用域 bin bash defi...
函式中區域性變數的返回
一般說來,函式中是可以進行區域性變數的返回的,不然豈不是全部要用全域性變數,如果使用了全域性變數,那還有必要進行返回嗎?那函式就沒有它存在的意義了!但是要注意了,這裡所謂的區域性變數的返回很有內涵,什麼樣的值才可以進行返回而不出錯?其實,只要遵守一句話即可 函式不能返回指向棧記憶體的指標!為什麼?因...
shell中區域性變數及local命令
local一般用於區域性變數宣告,多在在函式內部使用。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方為止。2 shell函式定義的變數預設是global的,其作用域從 函式被呼叫時執行變數定義的地方 開始,到shell結束或被顯示刪除...