當系統加載一個CLR的進程,進程里面可能有多個線程,這時候系統會給這個進程創建一個大小為1M的線程棧。這個線程棧用來存放方法調用的實參,和方法內部定義的局部變量。下圖展示了一個線程棧的棧內存。線程棧的存儲是從高位內存地址向地位內存地址構建的。現在假設線程棧執行的代碼要調用M1方法。
在這個很簡單的方法中,應該包含一些初始化這個方法的“序幕”代碼,和一些“尾聲”代碼,負責在方法調用完成之后對方法進行清理。然后才返回給這個方法的調用者。M1方法調用開始時,M1的序幕代碼在線程棧上分配局部變量name的內存。如下圖
然后M1調用M2方法,將name作為一個實參來傳遞。這造成name局部變量中的地址被壓入棧。如下圖:在M2方法內部,將使用名為s的參數變量來表示棧位置。另外調用一個方法時還要將一個返回地址壓入棧。被調用的方法結束后,應該返回到這個位置。如下圖:M1調用M2的時候將實參和返回地址壓入棧。
M2方法開始執行時,同樣它的“序幕”代碼在線程棧中為局部變量length和tally分配內存。如下圖,然后M2中的內部代碼開始執行。最終方法內部的代碼開始執行,最終到達return語句,此時CPU的指令指針被設置成線程棧中的返回地址。而且M2的棧幀會被展開。(我理解棧幀被展開的意思就是在線程棧中就M2方法的痕跡給消除,應該是被尾聲代碼所為),這點不是很理解,肯定不能是在清楚M2方法法的痕跡之后在返回,那樣返回地址已經不存在了,那就是程序在返回給調用者之后猜進行清理的?請教牛人。,之后M1會執行M2方法調用后面的代碼。最后M1會同M2一樣返回給調用者。
參考clr via C#
說的不對的地方,口下留情,疑惑地方請指點。