局部變量和函數參數為什么要放在棧中
局部變量,顧名思義其作用域屬于局部。全局的變量,意味著誰都隨時隨地可以訪問,所以其放在數據段中。而局部變量只是自己在用,放在數據段中純屬浪費空間,沒有必要,故將其放在自己的棧中,隨時可以清理,真正體現了局部的意義。
這個就是堆棧框架,棧由于是向下生長的,堆棧框架就是把esp指針提前加一個數,原esp指針到新esp指針之間的棧空間用來存儲局部變量。解釋一個概念,堆是程序運行過程中用于動態內存分配的內存空間,是操作系統為每個用戶進程規劃的,屬于軟件范疇。棧是處理器運行必備的內存空間,是硬件必需的,但又是由操作系統提供的。
堆是堆,而堆棧就是棧,和堆沒關系,只是都這么叫。棧和堆棧都是指的棧,在C程序的內存布局中,由于堆和棧的地址空間是接壤的,棧是從高地址往低地址發展,堆是從低地址往高地址發展,堆和棧早晚會碰頭,它們各自的大小取決于實際的使用情況,界限并不明朗,所以這可能是堆棧常放在一起稱呼的原因吧。
函數參數為什么放在棧區呢?第一也是其局限性導致,只有這個函數用這個參數,何必將其放在數據段呢?二是因為函數是在程序執行過程中調用的,屬于動態的調用,編譯時無法預測何時調用及被調用的次數,函數的參數及返回值都需要內存來存儲,如果是遞歸調用的話,參數及返回值需要的內存空間也就不確定了,這取決于遞歸的次數。有些體系結構的計算機也把函數參數放到寄存器里面去。
總之,在函數的編譯階段根本無法確定他會被調用幾次,其參數和函數的返回地址也要內存來存儲,所以也不知道其會需要多少內存。