




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第七章 運行時存儲空間的組織運行時環(huán)境從從“程序運行程序運行”說起說起 最初由最初由“OSOS”對程序進行控制對程序進行控制 OS OS 為程序分配存儲空間為程序分配存儲空間 OS OS 將代碼復制到所分配的存儲空間將代碼復制到所分配的存儲空間 OS OS 跳轉到程序的入口地址(跳轉到程序的入口地址(main)Zhou, Erqiang2School of Information and Software Engineering運行時環(huán)境函數(shù)的活動函數(shù)的活動 函數(shù)的函數(shù)的一次執(zhí)行一次執(zhí)行稱為函數(shù)的一次活動稱為函數(shù)的一次活動 函數(shù)的活動需要函數(shù)的活動需要 可執(zhí)行代碼可執(zhí)行代碼 存放所需信息的數(shù)據(jù)
2、結構存放所需信息的數(shù)據(jù)結構 活動記錄活動記錄Zhou, Erqiang3School of Information and Software Engineering活動記錄關于活動記錄關于活動記錄 討論討論一個活動記錄一個活動記錄中的數(shù)據(jù)安排中的數(shù)據(jù)安排 程序執(zhí)行過程中程序執(zhí)行過程中 所有活動記錄所有活動記錄的組織方式的組織方式 Zhou, Erqiang4School of Information and Software Engineering活動記錄Zhou, Erqiang5School of Information and Software Engineeringintint g()
3、 g() returnreturn 10; 10; intint f() f() returnreturn g(); g(); intint main() main() g(); g(); f(); f(); returnreturn 0; 0; intint g() g() returnreturn 10; 10; intint f(int x) f(int x) if if (x(x = 0)= 0) return return g(); g(); elseelse returnreturn f(x-1); f(x-1); intint main() main() f( f(2 2););
4、 returnreturn 0; 0; 函數(shù)棧幀Zhou, Erqiang6School of Information and Software Engineering函數(shù)棧幀函數(shù)棧幀(stack frame)(stack frame) 函數(shù)的每次執(zhí)行都獨立的對應一個函數(shù)的每次執(zhí)行都獨立的對應一個棧幀棧幀 當前被執(zhí)行函數(shù)對應的當前被執(zhí)行函數(shù)對應的棧幀棧幀在在棧的頂部棧的頂部 通過通過基址指針基址指針 與與 變量的偏移變量的偏移訪問臨時變量訪問臨時變量 void MyFunction()void MyFunction() int a, b, c; int a, b, c; a = 10; a =
5、 10; b = 5; b = 5; c = 2; c = 2;_MyFunction:_MyFunction: push push ebp ; ebp ; 保存保存“基址指針基址指針” ebpebp mov mov ebp, esp ; ebp, esp ; “基址指針基址指針” ebpebp指向棧頂指向棧頂 sub sub esp, 12 ; esp, 12 ; 在棧中為臨時變量分配空間在棧中為臨時變量分配空間mov ebp - 4, 10 ; mov ebp - 4, 10 ; 將將1010保存至變量保存至變量 a amov ebp - 8, 5 ; location of bmov e
6、bp - 8, 5 ; location of bmov ebp - 12, 2 ; location of cmov ebp - 12, 2 ; location of c活動記錄函數(shù)被多次調(diào)用函數(shù)被多次調(diào)用 對應多個活動記錄對應多個活動記錄 程序運行對應一個程序運行對應一個活動記錄樹活動記錄樹 輸入不同,活動記錄樹輸入不同,活動記錄樹可能可能有所不同有所不同 活動記錄之間活動記錄之間“相互嵌套相互嵌套” 可用可用“棧?!眮砀櫢骰顒佑涗泚砀櫢骰顒佑涗?當函數(shù)返回后相應的記錄當函數(shù)返回后相應的記錄不再不再被引用被引用Zhou, Erqiang7School of Information a
7、nd Software Engineering活動記錄“當函數(shù)返回后相應的記錄當函數(shù)返回后相應的記錄不再被引用不再被引用”有沒有反例?有沒有反例?Zhou, Erqiang8School of Information and Software Engineeringfunctionfunction CreateCounter() CreateCounter() varvar counter = 0; counter = 0;returnreturn function() function() counter +;counter +;returnreturn counter; counter;
8、活動記錄“當函數(shù)返回后相應的記錄當函數(shù)返回后相應的記錄不再被引用不再被引用”反例反例Zhou, Erqiang9School of Information and Software Engineeringfunction CreateCounter() function CreateCounter() var counter = 0;var counter = 0;return function() return function() counter +;counter +;return counter;return counter; function MyFunction() functio
9、n MyFunction() f = CreateCounter();f = CreateCounter();print(f();print(f();print(f();print(f(); MyFunctionCreateCountercounter = 0;f = 活動記錄“當函數(shù)返回后相應的記錄當函數(shù)返回后相應的記錄不再被引用不再被引用”反例反例Zhou, Erqiang10School of Information and Software Engineeringfunction CreateCounter() function CreateCounter() var counter
10、= 0;var counter = 0;return function() return function() counter +;counter +;return counter;return counter; function MyFunction() function MyFunction() f = CreateCounter();f = CreateCounter();f();f();f();f(); MyFunctionCreateCountercounter = 1;f = counter=2;兩種鏈接的區(qū)別?兩種鏈接的區(qū)別?活動記錄活動記錄的內(nèi)容活動記錄的內(nèi)容 返回地址返回地址
11、 控制鏈(動態(tài)鏈接)控制鏈(動態(tài)鏈接) 指向主調(diào)程序的活動記錄指向主調(diào)程序的活動記錄 存取鏈(靜態(tài)鏈接)存取鏈(靜態(tài)鏈接) 指向指向非局部變量非局部變量所在的活動記錄所在的活動記錄Zhou, Erqiang11School of Information and Software Engineering活動記錄活動記錄的內(nèi)容活動記錄的內(nèi)容 CPU CPU 現(xiàn)場現(xiàn)場 實際參數(shù)的個數(shù)實際參數(shù)的個數(shù) 形式參數(shù)形式參數(shù) 局部變量局部變量 臨時變量臨時變量 等等等等Zhou, Erqiang12School of Information and Software Engineering實際參數(shù)在哪里?實際
12、參數(shù)在哪里?局部變量局部變量 和和 臨時變量臨時變量有什么區(qū)別?有什么區(qū)別?編譯器不同而有所不同編譯器不同而有所不同變量的存儲分配局部變量局部變量 存儲空間存儲空間大小大小可根據(jù)其類型而可根據(jù)其類型而靜態(tài)確定靜態(tài)確定分配方法分配方法 按這些變量聲明時出現(xiàn)的次序按這些變量聲明時出現(xiàn)的次序 在局部數(shù)據(jù)域中依次分配空間在局部數(shù)據(jù)域中依次分配空間局部數(shù)據(jù)的地址局部數(shù)據(jù)的地址 棧幀的首地址棧幀的首地址 + + 數(shù)據(jù)的偏移數(shù)據(jù)的偏移Zhou, Erqiang13School of Information and Software Engineering變量的存儲分配局部數(shù)據(jù)的地址局部數(shù)據(jù)的地址 D D表示
13、活動記錄的首地址表示活動記錄的首地址 offset(x) offset(x): x x 在活動記錄中的偏移在活動記錄中的偏移 D+offset(x) D+offset(x) 為為 x x 的地址的地址1)1)如果如果 D D 和和 offset( offset(x x) ) 在編譯時都能確定下來在編譯時都能確定下來 x x 稱為稱為靜態(tài)變量靜態(tài)變量 如果語言僅支持靜態(tài)變量如果語言僅支持靜態(tài)變量 那么將那么將不支持不支持哪些功能?哪些功能?Zhou, Erqiang14School of Information and Software Engineering活動記錄在編譯時可確定活動記錄在編譯
14、時可確定包括包括大小大小和和位置位置變量的存儲分配D D表示活動記錄的首地址表示活動記錄的首地址 編譯時編譯時靜態(tài)確定靜態(tài)確定( (分配分配) ) 函數(shù)每次活動時函數(shù)每次活動時 活動記錄的位置活動記錄的位置相對固定相對固定 進程空間只允許有該函數(shù)的進程空間只允許有該函數(shù)的一個活動一個活動記錄記錄 不支持遞歸調(diào)用不支持遞歸調(diào)用 不支持動態(tài)數(shù)組不支持動態(tài)數(shù)組Zhou, Erqiang15School of Information and Software Engineering相對于程序自己相對于程序自己 的進程空間的進程空間變量的存儲分配2 2)如果)如果 offset( offset(x x)
15、 ) 在在編譯編譯時能確定下來時能確定下來 D D 在在運行運行時能確定下來時能確定下來 x x 稱為稱為半靜態(tài)變量半靜態(tài)變量 如果語言支持半靜態(tài)變量如果語言支持半靜態(tài)變量 程序單元可多次被激活程序單元可多次被激活 支持遞歸調(diào)用支持遞歸調(diào)用 活動記錄可用棧來實現(xiàn)活動記錄可用棧來實現(xiàn) 變量支持變量支持“棧式分配棧式分配”Zhou, Erqiang16School of Information and Software Engineering活動記錄活動記錄大小大小 在編譯時可確定在編譯時可確定變量的存儲分配3 3)如果)如果 D D和和offset(offset(x x) ) 在編譯時不能確定下
16、來在編譯時不能確定下來 但運行能確定但運行能確定 x x 稱為稱為半動態(tài)變量半動態(tài)變量 支持語言:支持語言:C99 C99 動態(tài)數(shù)組動態(tài)數(shù)組Zhou, Erqiang17School of Information and Software Engineering活動記錄活動記錄大小位置大小位置在編譯時不能確定在編譯時不能確定在運行時可確定在運行時可確定intint f() f() intint n; n; scanf(%d, &n); scanf(%d, &n); intint ar arrayrayn;n; printf(%dn, printf(%dn, sizeofsize
17、of(arrray);(arrray); returnreturn 0; 0; 活動記錄活動記錄保存什么?保存什么?變量的存儲分配3 3)x x 為為半動態(tài)變量半動態(tài)變量 x x 的其它屬于信息,如的其它屬于信息,如 數(shù)組元素的類型數(shù)組元素的類型 數(shù)組的維數(shù)數(shù)組的維數(shù) 數(shù)組首地址指針數(shù)組首地址指針 僅分配空間,運行時確定值僅分配空間,運行時確定值 x x 的描述符保存各屬性的描述符保存各屬性 運行時根據(jù)屬性計算變量的位置運行時根據(jù)屬性計算變量的位置Zhou, Erqiang18School of Information and Software Engineering變量的存儲分配3 3)活動
18、記錄中有)活動記錄中有半動態(tài)變量半動態(tài)變量 活動記錄能否由活動記錄能否由“棧?!眮韺崿F(xiàn)?來實現(xiàn)? 半動態(tài)變量能否支持半動態(tài)變量能否支持“棧式分配棧式分配”? 半動態(tài)變量可以半動態(tài)變量可以 動態(tài)分配在活動記錄的動態(tài)分配在活動記錄的“尾部尾部” 即運行棧的即運行棧的“棧頂棧頂” 半動態(tài)變量的半動態(tài)變量的生存期生存期與活動記錄相同與活動記錄相同 隨函數(shù)的退出而消亡隨函數(shù)的退出而消亡Zhou, Erqiang19School of Information and Software Engineering變量的存儲分配4 4)如果)如果 offset( offset(x x) ) 在編譯、運行時都不能確
19、定下來在編譯、運行時都不能確定下來 x x 的大小在運行時不固定的大小在運行時不固定 運行時可動態(tài)改變,運行時可動態(tài)改變,x x 稱為稱為動態(tài)變量動態(tài)變量 如果將如果將 x x 保存在活動記錄中保存在活動記錄中 每個活動記錄的長度不確定每個活動記錄的長度不確定 x x 的生存期與活動記錄不同步的生存期與活動記錄不同步 不能使用棧式分配不能使用棧式分配 如何解決?如何解決?Zhou, Erqiang20School of Information and Software Engineering變量的存儲分配4 4)x x 為為動態(tài)變量動態(tài)變量 使用另外的數(shù)據(jù)結構使用另外的數(shù)據(jù)結構“堆堆”來存儲來
20、存儲 需要堆的情況:需要堆的情況: 局部變量的值在單元活動后還需保留局部變量的值在單元活動后還需保留 調(diào)用單元與被調(diào)用單元調(diào)用單元與被調(diào)用單元 生存期不滿足先進后出模式生存期不滿足先進后出模式 Zhou, Erqiang21School of Information and Software Engineering進程的存儲組織方式進程的存儲組織方式 變量的存儲分配Zhou, Erqiang22School of Information and Software Engineering代碼代碼靜態(tài)數(shù)據(jù)靜態(tài)數(shù)據(jù)堆堆 棧棧 變量的存儲分配數(shù)據(jù)對象的存儲安排中的數(shù)據(jù)對象的存儲安排中的對齊問題對齊問題
21、typedeftypedef struct _a struct _a typedeftypedef struct _b struct _b charchar c1; c1; charchar c1; c1; longlong i1; i1; charchar c2; c2; charchar c2; c2; intint i1; i1; intint i2; i2; intint i2; i2;a;a; b; b;sizeof(a) sizeof(a) 與與 sizeof(b) sizeof(b) 一樣嗎一樣嗎?為什么為什么?Zhou, Erqiang23School of Informati
22、on and Software Engineering變量的存儲分配數(shù)據(jù)對象的存儲安排中的數(shù)據(jù)對象的存儲安排中的對齊問題對齊問題Zhou, Erqiang24School of Information and Software Engineeringchar c1; 1long i1; 4char c2; 1int i2; 4char c1; 1long i1; 4int i2; 4n+4nchar c2; 1n+8n+12struct _a32位機器位機器:sizeof(struct _a) = 16變量的存儲分配數(shù)據(jù)對象的存儲安排中的數(shù)據(jù)對象的存儲安排中的對齊問題對齊問題Zhou, Erq
23、iang25School of Information and Software Engineeringchar c1; 1char c2; 1long i1; 4int i2; 4char c1; 1long i1; 4int i2; 4char c2; 1n+4nn+1n+8struct _b32位機器位機器:sizeof(struct _b) = 12存儲分配模式靜態(tài)分配靜態(tài)分配 程序語言僅支持靜態(tài)變量程序語言僅支持靜態(tài)變量棧式分配棧式分配 半靜態(tài)變量、半動態(tài)變量半靜態(tài)變量、半動態(tài)變量 調(diào)用關系先進后出調(diào)用關系先進后出堆式分配堆式分配 動態(tài)變量動態(tài)變量Zhou, Erqiang26Sch
24、ool of Information and Software Engineering棧式存儲分配半靜態(tài)變量半靜態(tài)變量 offset(offset(x x) ) 在在編譯編譯時確定、時確定、D D 在在運行運行時確定時確定 活動記錄活動記錄 大小在編譯大小在編譯時確定、時確定、位置在運行位置在運行時確定時確定半動態(tài)變量半動態(tài)變量 D D和和offset(offset(x x) ) 在運行確定在運行確定 活動記錄大小、位置在活動記錄大小、位置在激活激活時確定時確定Zhou, Erqiang27School of Information and Software Engineering例子:過程例
25、子:過程A A調(diào)用過程調(diào)用過程P PSchool of Information and Software Engineering28Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量currentfreeA A的活動記錄的活動記錄返回地址返回地址 IP+X動態(tài)連接動態(tài)連接currentP P的活動記錄的活動記錄currentfree哪些指針在返回時需要恢復?哪些指針在返回時需要恢復?返回地址:指令指針返回地址:指令指針I(yè)P?current,free處理方法處理方法(1) (1) 設置當前棧指針設置當前棧指針current 表示當前活動記錄的開始位置表示當前活動記錄的開始位置 (活動記錄首地址
26、(活動記錄首地址D D,長度為,長度為L L)(2) (2) 指針指針free表示棧頂下一個可用單元表示棧頂下一個可用單元 free = current + L(3) (3) 局部變量局部變量X X在活動記錄中的位移為在活動記錄中的位移為 i i 變量的地址變量的地址current+i, , 值為值為Dcurrent+i棧式存儲分配 之半靜態(tài)變量Zhou, Erqiang29School of Information and Software Engineering處理方法處理方法(4) A(4) A調(diào)用調(diào)用B B時,時,B B單元被激活單元被激活 在在A A的棧幀(活動記錄)之上的棧幀(活動
27、記錄)之上 建立建立B B的當前實例的活動記錄的當前實例的活動記錄 將將currentcurrent和和freefree綁定于綁定于B B的活動記錄的活動記錄 綁定之前保存綁定之前保存currentcurrent指針的當前值指針的當前值(5) (5) 從從B B返回時,釋放其活動記錄返回時,釋放其活動記錄 恢復恢復currentcurrent和和freefree指針指針 棧式存儲分配 之半靜態(tài)變量Zhou, Erqiang30School of Information and Software Engineering動態(tài)連接動態(tài)連接動態(tài)鏈動態(tài)鏈AEFGF例:例:A call E; E call
28、 F; F call G; G call F;.School of Information and Software Engineering31Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量CALL P的翻譯的翻譯 1) 1) D free := ? (保存返回地址)(保存返回地址) 2) 2) Dfree + 1 := current (保存(保存currentcurrent) 3) 3) current := free (建立新的(建立新的currentcurrent) 4) 4) free := free + L (調(diào)整(調(diào)整freefree) 5) 5) ip := P(轉移到(
29、轉移到P P) 6) ( 6) (函數(shù)返回后需執(zhí)行的指令函數(shù)返回后需執(zhí)行的指令) )School of Information and Software Engineering32Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量ip + 5例子:過程例子:過程A A調(diào)用過程調(diào)用過程P PSchool of Information and Software Engineering33Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量返回地址返回地址動態(tài)連接動態(tài)連接currentfreeA A的活動記錄的活動記錄返回地址返回地址動態(tài)連接動態(tài)連接P P的活動記錄的活動記錄currentfree
30、如何返回?如何返回?free = currentcurrent = Dcurrent+1ip = DfreeRETURN語句的翻譯語句的翻譯 1) 1) 恢復恢復free free := current 2) 2) 恢復主調(diào)過程的恢復主調(diào)過程的current current := Dcurrent + 1 3) 3) 返回返回 ip := DfreeSchool of Information and Software Engineering34Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量例子:過程例子:過程P P退出,返回過程退出,返回過程A AcurrentSchool of Inf
31、ormation and Software Engineering35Zhou, Erqiang棧式存儲分配 之半靜態(tài)變量返回地址返回地址動態(tài)連接動態(tài)連接currentfreeA A的活動記錄的活動記錄返回地址返回地址動態(tài)連接動態(tài)連接P P的活動記錄的活動記錄freefree = currentcurrent = Dcurrent+1ip = Dfree處理方法處理方法 在活動記錄中為變量在活動記錄中為變量i i 建立描述符建立描述符 在活動記錄的最后(棧頂)分配變量在活動記錄的最后(棧頂)分配變量 i i 用用描述中的指針域描述中的指針域指向變量指向變量 i i 的存儲位置的存儲位置 產(chǎn)生相
32、關指令產(chǎn)生相關指令 創(chuàng)建變量存儲空間創(chuàng)建變量存儲空間 修改描述符修改描述符School of Information and Software Engineering36Zhou, Erqiang棧式存儲分配 之半動態(tài)變量處理方法處理方法School of Information and Software Engineering37Zhou, Erqiang棧式存儲分配 之半動態(tài)變量返回地址返回地址動態(tài)連接動態(tài)連接currentfree編譯時編譯時A A的活動記錄的活動記錄變量變量x x描述符描述符( (地址地址, ,大小等大小等) )運行時運行時 獲取元素個數(shù)獲取元素個數(shù) 計算數(shù)組大小計算數(shù)
33、組大小其它變量其它變量x x的存儲空間的存儲空間free修改修改free指針指針 free = free + L修改描述符修改描述符變量的作用域變量的作用域 指可訪問該變量的程序范圍指可訪問該變量的程序范圍 如何確定這個范圍?如何確定這個范圍? 制定作用域規(guī)則制定作用域規(guī)則作用域規(guī)則作用域規(guī)則 靜態(tài)作用域規(guī)則靜態(tài)作用域規(guī)則 動態(tài)作用域規(guī)則動態(tài)作用域規(guī)則School of Information and Software Engineering38Zhou, Erqiang非局部環(huán)境的引用靜態(tài)作用域規(guī)則靜態(tài)作用域規(guī)則 最近嵌套規(guī)則最近嵌套規(guī)則 引用引用最近的最近的“外層嵌套外層嵌套”中說明的變量
34、中說明的變量嵌套的層次嵌套的層次 若若A是是B的直接外層的直接外層, ,則則 B的層次的層次 = A的層次的層次 + 1+ 1School of Information and Software Engineering39Zhou, Erqiang非局部環(huán)境的引用School of Information and Software Engineering40Zhou, Erqiang非局部環(huán)境的引用unit A;y: int;unit B;end B;y: int;unit C;end D;end C;.unit D;.end A;end E;z: int;unit F;end G;unit
35、G; x,y: int; .unit E;z:=x+y;end F;.x: int;A(0)B(1)C(2)D(3)E(1)F(2)G(2)嵌套層次圖嵌套層次圖F F或或G G中能否調(diào)用中能否調(diào)用B?B?F F或或G G中能否調(diào)用中能否調(diào)用C?C?如何實現(xiàn)引用?如何實現(xiàn)引用?靜態(tài)作用域規(guī)則的引用方法靜態(tài)作用域規(guī)則的引用方法 將嵌套關系保存到活動記錄將嵌套關系保存到活動記錄通過通過“靜態(tài)連接靜態(tài)連接”實現(xiàn)實現(xiàn)靜態(tài)連接靜態(tài)連接 指向嵌套指向嵌套直接直接外層外層最新最新活動記錄的指針活動記錄的指針 保存位置:活動記錄中保存位置:活動記錄中第第3 3個個存儲單元存儲單元靜態(tài)鏈靜態(tài)鏈 運行時各活動記錄運
36、行時各活動記錄由靜態(tài)連接由靜態(tài)連接所構成的鏈所構成的鏈School of Information and Software Engineering41Zhou, Erqiang非局部環(huán)境的引用例:例:A call E; E call F; F call G; G call F;School of Information and Software Engineering42Zhou, Erqiang非局部環(huán)境的引用AEFGF.A(0)B(1)C(2)D(3)E(1)F(2)G(2)如何計算非局如何計算非局部部x x變量地址?變量地址?非局部變量非局部變量x x的地址的求法的地址的求法School
37、 of Information and Software Engineering43Zhou, Erqiang非局部環(huán)境的引用AEFGF.A(0)B(1)C(2)D(3)E(1)F(2)G(2)F F 引用引用 單元單元A A中的變量中的變量x x其在其在A A中的偏移為中的偏移為offsetoffsetcurrent嵌套層次:嵌套層次:2 2Dcurrent+2為靜態(tài)連接為靜態(tài)連接Dcurrent + 2Dcurrent + 2 + offsetcurrent非局部變量非局部變量x x的地址的求法的地址的求法 A是是B的直接外層的直接外層( (第第1個外層個外層) ) DA Dcurrent
38、 + 2 A是是B的第的第2個外層個外層 DA = DDcurrent + 2 + 2 A是是B的第的第3個外層個外層 DA = DDDcurrent + 2 2 2 可定義函數(shù)實現(xiàn)可定義函數(shù)實現(xiàn) DA 的獲取的獲取 School of Information and Software Engineering44Zhou, Erqiang非局部環(huán)境的引用嵌套層次:嵌套層次:2 2Dcurrent+2為靜態(tài)連接為靜態(tài)連接Dcurrent + 2Dcurrent + 2 + offsetDA:單元單元A的活動記錄首地址的活動記錄首地址假設單元假設單元p中引用了單元中引用了單元t中的變量中的變量x
39、且且p, t的深度分別為的深度分別為np, nt設設d = np nt, , 定義函數(shù)定義函數(shù) f(d) if( d = 0 ) then return current ; else return D f(d-1) + 2 ; f(0) = current; f(1) = Dcurrent+2; f(2) = D f(1)+2 = D Dcurrent+2 +2;School of Information and Software Engineering45Zhou, Erqiang非局部環(huán)境的引用通過通過靜態(tài)連接靜態(tài)連接可以引用非局部環(huán)境可以引用非局部環(huán)境 如何如何建立靜態(tài)連接建立靜態(tài)連接呢
40、?呢?什么時候建立?什么時候建立? 保存位置:在活動記錄的保存位置:在活動記錄的第第3 3個個存儲單元存儲單元 在返回地址、動態(tài)連接之后保存在返回地址、動態(tài)連接之后保存 在在處理程序單元調(diào)用處理程序單元調(diào)用時建立時建立怎么建立?怎么建立? 利用利用當前的棧幀當前的棧幀 考查嵌套結構下單元調(diào)用關系考查嵌套結構下單元調(diào)用關系School of Information and Software Engineering46Zhou, Erqiang非局部環(huán)境的引用嵌套結構下單元嵌套結構下單元 A 調(diào)用單元調(diào)用單元 BSchool of Information and Software Engineer
41、ing47Zhou, Erqiang非局部環(huán)境的引用(3) nA-nB = 1(4) nA-nB 1(1) nA-nB = -1(2) nA-nB = 0BAcall BABcall BBAcall BBcall BA通過通過當前棧幀當前棧幀建立建立B的靜態(tài)連接的靜態(tài)連接current=f(0)Dcurrent + 2 =f(1)f(2)f(d+1)因此,靜態(tài)連接因此,靜態(tài)連接 Dfree+2 的值的值為為 f(d+1)單元調(diào)用語句單元調(diào)用語句 CALL P 的翻譯的翻譯 1) 1) D free := ? (保存返回地址)(保存返回地址) 2) 2) Dfree + 1 := current
42、 (保存(保存currentcurrent) 3) 3) Dfree + 2 := f(d+1) (保存靜態(tài)連接)(保存靜態(tài)連接) 4) 4) current := free (建立新的(建立新的currentcurrent) 5) 5) free := free + L (調(diào)整(調(diào)整freefree) 6) 6) ip := P(轉移到(轉移到P P) 7) ( 7) (函數(shù)返回后需執(zhí)行的指令函數(shù)返回后需執(zhí)行的指令) )School of Information and Software Engineering48Zhou, Erqiang非局部環(huán)境的引用ip + 6動態(tài)作用域規(guī)則動態(tài)作用域
43、規(guī)則 一種最近一種最近活動規(guī)則活動規(guī)則對非局部變量對非局部變量 引用的最近的引用的最近的“調(diào)用外層調(diào)用外層”中說明的變量中說明的變量 生存期嵌套生存期嵌套例:例:AEF的調(diào)用序列的調(diào)用序列 F的直接調(diào)用外層為的直接調(diào)用外層為E E的直接調(diào)用外層為的直接調(diào)用外層為ASchool of Information and Software Engineering49Zhou, Erqiang非局部環(huán)境的引用如何引用非局部變量?如何引用非局部變量?直接使用直接使用動態(tài)連接!動態(tài)連接!數(shù)據(jù)參數(shù)傳遞數(shù)據(jù)參數(shù)傳遞School of Information and Software Engineering50Z
44、hou, Erqiang參數(shù)傳遞procedure swap (a , b : integer);var temp : integer;begin temp := a; a := b; b := tempend; swap ( i , ai ) i = 3 , a = 7,1,4,5,8數(shù)據(jù)參數(shù)傳遞之數(shù)據(jù)參數(shù)傳遞之引址調(diào)用引址調(diào)用 將將實參的地址實參的地址傳遞給相應的形參傳遞給相應的形參 在單元中對形參的引用在單元中對形參的引用 實際上是實際上是對對形式單元中形式單元中實參地址實參地址的引用的引用School of Information and Software Engineering51Zhou, Erqiang參數(shù)傳遞swap(i,ai); swap(i,ai); 相當于執(zhí)行相當于執(zhí)行: : a := i a := i的地址的地址; ; b := a3 b := a3的地址的地址; ; temp := a temp := a ; (temp=3); (temp=3) a a := b := b ; (i=4); (i=4) b b := temp; (a3=temp=3) := temp; (a3=temp=3)執(zhí)行結果執(zhí)行結果: i=4, a3=3: i=4, a3=3數(shù)據(jù)參數(shù)傳遞之數(shù)據(jù)參數(shù)傳遞之值調(diào)用值調(diào)用 形參只起形參只起局部變量局部變量作用作用 (1)(1)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 直升機緊急醫(yī)療救援空域使用協(xié)議
- 寵物連鎖加盟店品牌授權及市場拓展支持協(xié)議
- 基因編輯技術治療性抗體研發(fā)轉化合作協(xié)議
- 高端制造企業(yè)股權并購融資合作協(xié)議
- 精密諧波減速器壽命測試臺租賃及維護服務合同
- 境外收入稅收籌劃與稅務咨詢合同
- 商業(yè)綜合體建筑工程總承包及室內(nèi)外環(huán)境監(jiān)測合同
- 消防安全評估與整改方案實施合同
- 職業(yè)院校特色專業(yè)外聘教師長期聘用合同
- 社區(qū)生鮮超市合伙人應急管理與風險預防協(xié)議
- 2025年四川省成都市青羊區(qū)中考數(shù)學二診試卷
- 勞動鑄就夢想奮斗開創(chuàng)未來課件-高一下學期五一勞動節(jié)勵志主題班會
- 事故隱患內(nèi)部報告獎勵制度
- 2024年高考真題-地理(河北卷) 含答案
- DB32T 4353-2022 房屋建筑和市政基礎設施工程檔案資料管理規(guī)程
- 深圳某旅游口岸施工組織設計
- GB∕T 25684.6-2021 土方機械 安全 第6部分:自卸車的要求
- 四川省職工住房補貼實施辦法
- 學生活動場地借用流程
- 遼寧醫(yī)院明細.xls
- JYC全自動變頻抗干擾介質(zhì)損耗測試儀
評論
0/150
提交評論