編譯原理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理學(xué)習(xí)培訓(xùn)模板課件_第1頁(yè)
編譯原理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理學(xué)習(xí)培訓(xùn)模板課件_第2頁(yè)
編譯原理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理學(xué)習(xí)培訓(xùn)模板課件_第3頁(yè)
編譯原理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理學(xué)習(xí)培訓(xùn)模板課件_第4頁(yè)
編譯原理運(yùn)行時(shí)存儲(chǔ)空間的組織和管理學(xué)習(xí)培訓(xùn)模板課件_第5頁(yè)
已閱讀5頁(yè),還剩162頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 過(guò)程的活動(dòng)過(guò)程的一次執(zhí)行稱為過(guò)程的一次活動(dòng)第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 過(guò)程的活動(dòng)過(guò)程的一次執(zhí)行稱為過(guò)程的一次活動(dòng)活動(dòng)記錄過(guò)程的活動(dòng)需要可執(zhí)行代碼和存放所需信息的存儲(chǔ)空間,后者稱為活動(dòng)記錄第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 過(guò)程的活動(dòng)過(guò)程的一次執(zhí)行稱為過(guò)程的一次活動(dòng)活動(dòng)記錄過(guò)程的活動(dòng)需要可執(zhí)行代碼和存放所需信息的存儲(chǔ)空間,后者稱為活動(dòng)記錄本章內(nèi)容討論一個(gè)活動(dòng)記錄中的數(shù)據(jù)安排第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 過(guò)程的活動(dòng)過(guò)程的一次執(zhí)行稱為過(guò)程的一次活動(dòng)活動(dòng)記錄過(guò)程的活動(dòng)需要可執(zhí)行代碼和存放所需信息的存儲(chǔ)空間,后者稱為活動(dòng)記錄本章內(nèi)容討論一個(gè)活動(dòng)記錄中的數(shù)

2、據(jù)安排程序執(zhí)行過(guò)程中,所有活動(dòng)記錄的組織方式 第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量過(guò)程調(diào)用的參數(shù)傳遞方式第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響

3、存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量過(guò)程調(diào)用的參數(shù)傳遞方式過(guò)程能否作為參數(shù)被傳遞第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量過(guò)程調(diào)用的參數(shù)傳遞方式過(guò)程能否作為參數(shù)被傳遞過(guò)程能否作為結(jié)果值傳遞第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量過(guò)程調(diào)用的參數(shù)傳遞方式過(guò)程能否作為參數(shù)被傳遞過(guò)程能否作為結(jié)果值傳遞存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)

4、地分配第六章 運(yùn)行時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配策略的語(yǔ)言特征 過(guò)程能否遞歸當(dāng)控制從過(guò)程的活動(dòng)返回時(shí),局部變量的值是否要保留過(guò)程能否訪問(wèn)非局部變量過(guò)程調(diào)用的參數(shù)傳遞方式過(guò)程能否作為參數(shù)被傳遞過(guò)程能否作為結(jié)果值傳遞存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)地分配存儲(chǔ)塊是否必須顯式地釋放6.1 局部存儲(chǔ)分配6.1.1 過(guò)程過(guò)程定義、過(guò)程調(diào)用、形式參數(shù)、實(shí)在參數(shù)、活動(dòng)的生存期6.1 局部存儲(chǔ)分配6.1.2 名字的作用域和綁定名字的作用域一個(gè)聲明起作用的程序部分稱為該聲明的作用域即使一個(gè)名字在程序中只聲明一次,該名字在程序運(yùn)行時(shí)也可能表示不同的數(shù)據(jù)對(duì)象6.1 局部存儲(chǔ)分配從名字到值的兩步映射名字存儲(chǔ)單元狀態(tài)值環(huán)

5、境6.1 局部存儲(chǔ)分配從名字到值的兩步映射環(huán)境把名字映射到左值,而狀態(tài)把左值映射到右值名字存儲(chǔ)單元狀態(tài)值環(huán)境6.1 局部存儲(chǔ)分配從名字到值的兩步映射環(huán)境把名字映射到左值,而狀態(tài)把左值映射到右值賦值改變狀態(tài),但不改變環(huán)境 名字存儲(chǔ)單元狀態(tài)值環(huán)境6.1 局部存儲(chǔ)分配從名字到值的兩步映射環(huán)境把名字映射到左值,而狀態(tài)把左值映射到右值賦值改變狀態(tài),但不改變環(huán)境 過(guò)程調(diào)用改變環(huán)境名字存儲(chǔ)單元狀態(tài)值環(huán)境6.1 局部存儲(chǔ)分配從名字到值的兩步映射環(huán)境把名字映射到左值,而狀態(tài)把左值映射到右值賦值改變狀態(tài),但不改變環(huán)境 過(guò)程調(diào)用改變環(huán)境如果環(huán)境將名字x映射到存儲(chǔ)單元s,我們就說(shuō)x被綁定到s名字存儲(chǔ)單元狀態(tài)值環(huán)境6.

6、1 局部存儲(chǔ)分配靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜 態(tài) 概 念 動(dòng) 態(tài) 對(duì) 應(yīng) 過(guò)程的定義 過(guò)程的活動(dòng) 6.1 局部存儲(chǔ)分配靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜 態(tài) 概 念 動(dòng) 態(tài) 對(duì) 應(yīng) 過(guò)程的定義 過(guò)程的活動(dòng) 名字的聲明 名字的綁定 6.1 局部存儲(chǔ)分配靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜 態(tài) 概 念 動(dòng) 態(tài) 對(duì) 應(yīng) 過(guò)程的定義 過(guò)程的活動(dòng) 名字的聲明 名字的綁定 聲明的作用域 綁定的生存期 6.1 局部存儲(chǔ)分配6.1.3 活動(dòng)記錄一般的活動(dòng)記錄的布局返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.1 局部存儲(chǔ)分配6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位6.1 局部存儲(chǔ)分

7、配6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位變量所需的存儲(chǔ)空間可以根據(jù)其類(lèi)型而靜態(tài)確定6.1 局部存儲(chǔ)分配6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位變量所需的存儲(chǔ)空間可以根據(jù)其類(lèi)型而靜態(tài)確定一個(gè)過(guò)程所聲明的局部變量,按這些變量聲明時(shí)出現(xiàn)的次序,在局部數(shù)據(jù)域中依次分配空間6.1 局部存儲(chǔ)分配6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單位變量所需的存儲(chǔ)空間可以根據(jù)其類(lèi)型而靜態(tài)確定一個(gè)過(guò)程所聲明的局部變量,按這些變量聲明時(shí)出現(xiàn)的次序,在局部數(shù)據(jù)域中依次分配空間局部數(shù)據(jù)的地址可以用相對(duì)于某個(gè)位置的地址來(lái)表示6.1 局部存儲(chǔ)分配6.1.4 局部數(shù)據(jù)的安排字節(jié)是可編址內(nèi)存的最小單

8、位變量所需的存儲(chǔ)空間可以根據(jù)其類(lèi)型而靜態(tài)確定一個(gè)過(guò)程所聲明的局部變量,按這些變量聲明時(shí)出現(xiàn)的次序,在局部數(shù)據(jù)域中依次分配空間局部數(shù)據(jù)的地址可以用相對(duì)于某個(gè)位置的地址來(lái)表示數(shù)據(jù)對(duì)象的存儲(chǔ)安排還有一個(gè)對(duì)齊問(wèn)題6.1 局部存儲(chǔ)分配在SPARC/Solaris工作站上下面兩個(gè)結(jié)構(gòu)的size分別是24和16,為什么不一樣?typedef struct _atypedef struct _bchar c1; char c1;long i; char c2;charc2; long i;double f; double f;a; b;6.1 局部存儲(chǔ)分配在SPARC/Solaris工作站上下面兩個(gè)結(jié)構(gòu)的si

9、ze分別是24和16,為什么不一樣?typedef struct _atypedef struct _bchar c1;0 char c1;0long i;4 char c2; 1charc2;8 long i; 4double f;16 double f; 8a; b;6.1 局部存儲(chǔ)分配在X86/Linux機(jī)器的結(jié)果和SPARC/Solaris工作站不一樣,是20和16。typedef struct _atypedef struct _bchar c1;0 char c1;0long i;4 char c2; 1charc2;8 long i; 4double f;12 double f;

10、 8a; b;6.1 局部存儲(chǔ)分配6.1.5 程序塊本身含有局部變量聲明的語(yǔ)句可以嵌套最接近的嵌套作用域規(guī)則并列程序塊不會(huì)同時(shí)活躍并列程序塊的變量可以重疊分配6.1 局部存儲(chǔ)分配main() / begin of B0 / int a = 0; int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / / end of B1 / end of B0 /6.1 局部存儲(chǔ)分配main() / begin of B0 /

11、 int a = 0; int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / / end of B1 / end of B0 /聲 明 作 用 域 int a = 0; B0 B2 int b = 0; B0 B1 int b = 1; B1 B3 int a = 2;B2int b = 3; B3 6.1 局部存儲(chǔ)分配main() / begin of B0 / int a = 0; int b = 0; /

12、 begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / / end of B1 / end of B0 /聲 明 作 用 域 int a = 0; B0 B2 int b = 0; B0 B1 int b = 1; B1 B3 int a = 2;B2int b = 3; B3 a0b0b1a2, b3重疊分配存儲(chǔ)單元 6.2 全局棧式存儲(chǔ)分配介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略6.2 全局棧式存儲(chǔ)分配介紹程序運(yùn)行時(shí)所需

13、的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略描述過(guò)程的目標(biāo)代碼怎樣訪問(wèn)綁定到局部名字的存儲(chǔ)單元6.2 全局棧式存儲(chǔ)分配介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略描述過(guò)程的目標(biāo)代碼怎樣訪問(wèn)綁定到局部名字的存儲(chǔ)單元介紹三種分配策略靜態(tài)分配策略6.2 全局棧式存儲(chǔ)分配介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略描述過(guò)程的目標(biāo)代碼怎樣訪問(wèn)綁定到局部名字的存儲(chǔ)單元介紹三種分配策略靜態(tài)分配策略棧式分配策略6.2 全局棧式存儲(chǔ)分配介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略描述過(guò)程的目標(biāo)代碼怎樣訪問(wèn)綁定到局部名字的存儲(chǔ)單元介紹三種分配策略靜態(tài)分配策略棧式分配策略堆式分配策略6.2 全局棧式存

14、儲(chǔ)分配6.2.1 運(yùn)行時(shí)內(nèi)存的劃分代 碼靜 態(tài) 數(shù) 據(jù)堆棧6.2 全局棧式存儲(chǔ)分配靜態(tài)分配名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需要運(yùn)行時(shí)的任何支持6.2 全局棧式存儲(chǔ)分配靜態(tài)分配名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需要運(yùn)行時(shí)的任何支持綁定的生存期是程序的整個(gè)運(yùn)行期間6.2 全局棧式存儲(chǔ)分配靜態(tài)分配給語(yǔ)言帶來(lái)限制遞歸過(guò)程不被允許6.2 全局棧式存儲(chǔ)分配靜態(tài)分配給語(yǔ)言帶來(lái)限制遞歸過(guò)程不被允許數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,必須是在編譯時(shí)可以知道的6.2 全局棧式存儲(chǔ)分配靜態(tài)分配給語(yǔ)言帶來(lái)限制遞歸過(guò)程不被允許數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,必須是在編譯時(shí)可以知道的數(shù)據(jù)結(jié)構(gòu)不能動(dòng)態(tài)建立6.

15、2 全局棧式存儲(chǔ)分配 C語(yǔ)言程序的外部變量和程序中出現(xiàn)的常量都可以靜態(tài)分配聲明在函數(shù)外面外部變量 靜態(tài)分配靜態(tài)外部變量 靜態(tài)分配聲明在函數(shù)里面靜態(tài)局部變量 也是靜態(tài)分配自動(dòng)變量 不能靜態(tài)分配6.2 全局棧式存儲(chǔ)分配6.2.2 活動(dòng)樹(shù)和運(yùn)行棧活動(dòng)樹(shù):用樹(shù)來(lái)描繪控制進(jìn)入和離開(kāi)活動(dòng)的方式mq(1,9)rp(1,9)q(1,3)q(1,0)p(1,3)q(2,3)q(2,1)q(3,3)p(2,3)q(5,9)q(5,5)p(5,9)q(7,9)q(7,7)q(9,9)p(7,9)6.2 全局棧式存儲(chǔ)分配活動(dòng)樹(shù)的特點(diǎn)每個(gè)結(jié)點(diǎn)代表某過(guò)程的一個(gè)活動(dòng)根結(jié)點(diǎn)代表主程序的活動(dòng)結(jié)點(diǎn)a是結(jié)點(diǎn)b的父結(jié)點(diǎn),當(dāng)且僅當(dāng)控制

16、流從a的活動(dòng)進(jìn)入b的活動(dòng)結(jié)點(diǎn)a處于結(jié)點(diǎn)b的左邊,當(dāng)且僅當(dāng)a的生存期先于b的生存期6.2 全局棧式存儲(chǔ)分配當(dāng)前活躍著的過(guò)程活動(dòng)可以保存在一個(gè)棧中控制棧的內(nèi)容:m, q (1, 9), q (1, 3), q (2, 3) mq(1,9)rp(1,9)q(1,3)q(1,0)p(1,3)q(2,3)q(2,1)q(3,3)p(2,3)q(5,9)q(5,5)p(5,9)q(7,9)q(7,7)q(9,9)p(7,9)6.2 全局棧式存儲(chǔ)分配運(yùn)行棧:把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息(即活動(dòng)記錄) 6.2 全局棧式存儲(chǔ)分配運(yùn)行棧:把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息

17、(即活動(dòng)記錄) ma : arraym6.2 全局棧式存儲(chǔ)分配運(yùn)行棧:把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mi: integerra : arraymr6.2 全局棧式存儲(chǔ)分配運(yùn)行棧:把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mk: integerq (1, 9)a : arraymq(1,9)r6.2 全局棧式存儲(chǔ)分配運(yùn)行棧:把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息(即活動(dòng)記錄) mk: integerq (1, 9)a : arrayq (1, 3)k: integermq(1,9)rp(1,9)q(1,3)q(1,0)

18、p(1,3)6.2 全局棧式存儲(chǔ)分配6.2.3 調(diào)用序列過(guò)程調(diào)用和過(guò)程返回都需要執(zhí)行一些代碼來(lái)管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等6.2 全局棧式存儲(chǔ)分配6.2.3 調(diào)用序列過(guò)程調(diào)用和過(guò)程返回都需要執(zhí)行一些代碼來(lái)管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等過(guò)程調(diào)用序列過(guò)程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼6.2 全局棧式存儲(chǔ)分配6.2.3 調(diào)用序列過(guò)程調(diào)用和過(guò)程返回都需要執(zhí)行一些代碼來(lái)管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等過(guò)程調(diào)用序列過(guò)程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼過(guò)程返回序列過(guò)程返回時(shí)執(zhí)行的恢復(fù)機(jī)器狀態(tài),釋放活動(dòng)記錄,使調(diào)用過(guò)程能夠繼續(xù)執(zhí)行的代碼6.2 全局棧式存

19、儲(chǔ)分配過(guò)程調(diào)用和過(guò)程返回都需要執(zhí)行一些代碼來(lái)管理活動(dòng)記錄棧,保存或恢復(fù)機(jī)器狀態(tài)等過(guò)程調(diào)用序列過(guò)程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填入它的域中的代碼過(guò)程返回序列過(guò)程返回時(shí)執(zhí)行的恢復(fù)機(jī)器狀態(tài),釋放活動(dòng)記錄,使調(diào)用過(guò)程能夠繼續(xù)執(zhí)行的代碼調(diào)用序列和返回序列常常都分成兩部分,分處于調(diào)用過(guò)程和被調(diào)用過(guò)程中6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序

20、,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則以活動(dòng)記錄中間的某個(gè)位置作為基地址返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則以活動(dòng)記錄中間的某個(gè)位置作為基地址長(zhǎng)度能較早確定的域放在活動(dòng)記錄的中間返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則一般把臨時(shí)數(shù)據(jù)域

21、放在局部數(shù)據(jù)域的后面返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則一般把臨時(shí)數(shù)據(jù)域放在局部數(shù)據(jù)域的后面把參數(shù)域和可能有的返回值域放在緊靠調(diào)用者活動(dòng)記錄的地方返 回 值臨 時(shí) 數(shù) 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配即使是同一種語(yǔ)言,過(guò)程調(diào)用序列、返回序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異設(shè)計(jì)這些序列和活動(dòng)記錄的一些原則用同樣的代碼來(lái)執(zhí)行各個(gè)活動(dòng)的保存和恢復(fù)返 回 值臨 時(shí) 數(shù)

22、 據(jù)參 數(shù)控 制 鏈訪 問(wèn) 鏈機(jī) 器 狀 態(tài)局 部 數(shù) 據(jù)6.2 全局棧式存儲(chǔ)分配調(diào)用者和被調(diào)用者之間的任務(wù)劃分被調(diào)用者的責(zé)任調(diào)用者的責(zé)任調(diào)用者的活動(dòng)記錄被調(diào)用者的活動(dòng)記錄臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù) 控制鏈 和保存的機(jī)器狀態(tài)top_sp base_sp 棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈 和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配過(guò)程p調(diào)用過(guò)程q的調(diào)用序列p計(jì)算實(shí)參,依次放入棧頂,并在棧頂留出放返回值的空間。top_sp的值在此過(guò)程中被改變p把返回地址和當(dāng)前base_sp的值存入q的活動(dòng)記錄中,建立q的訪問(wèn)鏈,增加base_sp的值q保存寄存器的值和其它機(jī)器狀態(tài)信息q根據(jù)局部數(shù)據(jù)域

23、和臨時(shí)數(shù)據(jù)域的大小增加top_sp的值,初始化它的局部數(shù)據(jù),并開(kāi)始執(zhí)行過(guò)程體6.2 全局棧式存儲(chǔ)分配調(diào)用者和被調(diào)用者之間的任務(wù)劃分被調(diào)用者的責(zé)任調(diào)用者的責(zé)任調(diào)用者的活動(dòng)記錄被調(diào)用者的活動(dòng)記錄臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù) 控制鏈 和保存的機(jī)器狀態(tài)top_sp base_sp 棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈 和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配過(guò)程p調(diào)用過(guò)程q的返回序列q把返回值置入鄰近p的活動(dòng)記錄的地方q對(duì)應(yīng)調(diào)用序列的步驟(4),減小top_sp的值 q恢復(fù)寄存器(包括base_sp)和機(jī)器狀態(tài),返回pp根據(jù)參數(shù)個(gè)數(shù)與類(lèi)型和返回值類(lèi)型調(diào)整top_sp,然后取出返回值6.2 全

24、局棧式存儲(chǔ)分配調(diào)用者和被調(diào)用者之間的任務(wù)劃分被調(diào)用者的責(zé)任調(diào)用者的責(zé)任調(diào)用者的活動(dòng)記錄被調(diào)用者的活動(dòng)記錄臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù) 控制鏈 和保存的機(jī)器狀態(tài)top_sp base_sp 棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈 和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配過(guò)程的參數(shù)個(gè)數(shù)可變的情況函數(shù)返回值改成用寄存器傳遞編譯器產(chǎn)生將這些參數(shù)逆序進(jìn)棧的代碼被調(diào)用函數(shù)能準(zhǔn)確地知道第一個(gè)參數(shù)的位置被調(diào)用函數(shù)根據(jù)第一個(gè)參數(shù)到棧中取第二、第三個(gè)參數(shù)等等6.2 全局棧式存儲(chǔ)分配調(diào)用者和被調(diào)用者之間的任務(wù)劃分被調(diào)用者的責(zé)任調(diào)用者的責(zé)任調(diào)用者的活動(dòng)記錄被調(diào)用者的活動(dòng)記錄臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和

25、參數(shù) 控制鏈 和保存的機(jī)器狀態(tài)top_sp base_sp 棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈 和保存的機(jī)器狀態(tài) 6.2 全局棧式存儲(chǔ)分配6.2.4 棧上可變長(zhǎng)數(shù)據(jù)活動(dòng)記錄的長(zhǎng)度在編譯時(shí)不能確定的情況局部數(shù)組的大小要等到過(guò)程激活時(shí)才能確定在活動(dòng)記錄中為這樣的數(shù)組分別存放數(shù)組指針的單元運(yùn)行時(shí),這些指針指向分配在棧頂?shù)拇鎯?chǔ)空間6.2 全局棧式存儲(chǔ)分配訪問(wèn)動(dòng)態(tài)分配的數(shù)組q的數(shù)組q的活動(dòng)記錄p的數(shù)組p的活動(dòng)記錄控制鏈top_sp base_sp 數(shù)組A的指針數(shù)組B的指針數(shù)組A數(shù)組B控制鏈. . . . . . .棧6.2 全局棧式存儲(chǔ)分配6.2.5 懸空引用懸空引用:引用某個(gè)已被釋放的存儲(chǔ)單元6.2 全

26、局棧式存儲(chǔ)分配6.2.5 懸空引用懸空引用:引用某個(gè)已被釋放的存儲(chǔ)單元main()|int dangle ( ) |int q;|int j = 20; q = dangle ( );|return &j;|6.3 非局部名字的訪問(wèn)本節(jié)介紹無(wú)過(guò)程嵌套的靜態(tài)作用域(C語(yǔ)言)有過(guò)程嵌套的靜態(tài)作用域(Pascal語(yǔ)言)動(dòng)態(tài)作用域(Lisp語(yǔ)言)6.3 非局部名字的訪問(wèn)6.3.1 無(wú)過(guò)程嵌套的靜態(tài)作用域過(guò)程體中的非局部引用可以直接使用靜態(tài)確定的地址6.3 非局部名字的訪問(wèn)6.3.1 無(wú)過(guò)程嵌套的靜態(tài)作用域過(guò)程體中的非局部引用可以直接使用靜態(tài)確定的地址局部變量在棧頂?shù)幕顒?dòng)記錄中,可以通過(guò)base_sp指

27、針來(lái)訪問(wèn)6.3 非局部名字的訪問(wèn)6.3.1 無(wú)過(guò)程嵌套的靜態(tài)作用域過(guò)程體中的非局部引用可以直接使用靜態(tài)確定的地址局部變量在棧頂?shù)幕顒?dòng)記錄中,可以通過(guò)base_sp指針來(lái)訪問(wèn)無(wú)須深入棧中取數(shù)據(jù),無(wú)須訪問(wèn)鏈6.3 非局部名字的訪問(wèn)6.3.1 無(wú)過(guò)程嵌套的靜態(tài)作用域過(guò)程體中的非局部引用可以直接使用靜態(tài)確定的地址局部變量在棧頂?shù)幕顒?dòng)記錄中,可以通過(guò)base_sp指針來(lái)訪問(wèn)無(wú)須深入棧中取數(shù)據(jù),無(wú)須訪問(wèn)鏈過(guò)程可以作為參數(shù)來(lái)傳遞,也可以作為結(jié)果來(lái)返回6.3 非局部名字的訪問(wèn)6.3.2 有過(guò)程嵌套的靜態(tài)作用域sortreadarrayexchangequicksortpartition6.3 非局部名字的訪問(wèn)

28、6.3.2 有過(guò)程嵌套的靜態(tài)作用域過(guò)程嵌套深度sort1readarray2exchange2quicksort2partition36.3 非局部名字的訪問(wèn)6.3.2 有過(guò)程嵌套的靜態(tài)作用域過(guò)程嵌套深度sort1readarray2exchange2quicksort2partition3變量的嵌套深度:它的聲明所在過(guò)程的嵌套深度作為該名字的嵌套深度6.3 非局部名字的訪問(wèn)尋找非局部名字存儲(chǔ)單元的訪問(wèn)鏈 sa, xq (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1,

29、 3)i, j訪問(wèn)鏈e (1, 3)訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈6.3 非局部名字的訪問(wèn)假定過(guò)程p的嵌套深度為np,它引用嵌套深度為na的變量a,na np。如何訪問(wèn)a的存儲(chǔ)單元sort1readarray2exchange2quicksort2partition36.3 非局部名字的訪問(wèn)假定過(guò)程p的嵌套深度為np,它引用嵌套深度為na的變量a,na np。如何訪問(wèn)a的存儲(chǔ)單元從棧頂?shù)幕顒?dòng)記錄開(kāi)始,追蹤訪問(wèn)鏈np na次6.3 非局部名字的訪問(wèn)假定過(guò)程p的嵌套深度為np,它引用嵌套深度為na的變量a,na np。如何

30、訪問(wèn)a的存儲(chǔ)單元從棧頂?shù)幕顒?dòng)記錄開(kāi)始,追蹤訪問(wèn)鏈np na次到達(dá)a的聲明所在過(guò)程的活動(dòng)記錄6.3 非局部名字的訪問(wèn)假定過(guò)程p的嵌套深度為np,它引用嵌套深度為na的變量a,na np。如何訪問(wèn)a的存儲(chǔ)單元從棧頂?shù)幕顒?dòng)記錄開(kāi)始,追蹤訪問(wèn)鏈np na次到達(dá)a的聲明所在過(guò)程的活動(dòng)記錄訪問(wèn)鏈的追蹤用間接操作就可完成6.3 非局部名字的訪問(wèn)訪問(wèn)非局部名字的存儲(chǔ)單元 sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (

31、1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈e (1, 3)訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈6.3 非局部名字的訪問(wèn)過(guò)程p對(duì)變量a訪問(wèn)時(shí),a的地址由下面的二元組表示:(np na,a在活動(dòng)記錄中的偏移)6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況sort1readarray2exchange2quicksort2partition36.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況x肯定就聲明在p中6.

32、3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況x肯定就聲明在p中被調(diào)用過(guò)程的訪問(wèn)鏈必須指向調(diào)用過(guò)程的活動(dòng)記錄的訪問(wèn)鏈6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈e (1, 3)訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1,

33、 3)i, j訪問(wèn)鏈6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況sort1readarray2exchange2quicksort2partition36.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過(guò)程肯定相同6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過(guò)程肯定相同追蹤訪問(wèn)鏈np nx + 1次,到達(dá)了靜態(tài)包圍x和p的且離它們最近的那個(gè)過(guò)

34、程的最新活動(dòng)記錄6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度為np的過(guò)程p調(diào)用嵌套深度為nx的過(guò)程xnp nx的情況p和x的嵌套深度分別為1,2,nx 1的外圍過(guò)程肯定相同追蹤訪問(wèn)鏈np nx + 1次,到達(dá)了靜態(tài)包圍x和p的且離它們最近的那個(gè)過(guò)程的最新活動(dòng)記錄所到達(dá)的活動(dòng)記錄就是x的活動(dòng)記錄中的訪問(wèn)鏈應(yīng)該指向的那個(gè)活動(dòng)記錄6.3 非局部名字的訪問(wèn)建立訪問(wèn)鏈sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q

35、 (1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈e (1, 3)訪問(wèn)鏈sa, xq (1, 3)k, v訪問(wèn)鏈q (1, 9)k, v訪問(wèn)鏈p (1, 3)i, j訪問(wèn)鏈6.3 非局部名字的訪問(wèn)program param(input, output);(過(guò)程作為參數(shù))procedure b(function h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin

36、m := 0; b(f) end c; begin cend.6.3 非局部名字的訪問(wèn)program param(input, output);(過(guò)程作為參數(shù))procedure b(function h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin m := 0; b(f) end c; begin cend.過(guò)程作為參數(shù)傳遞時(shí),怎樣在該過(guò)程被激活時(shí)建立它的訪問(wèn)鏈6

37、.3 非局部名字的訪問(wèn)program param(input, output);(過(guò)程作為參數(shù))procedure b(function h(n: integer): integer); begin writeln(h(2) end b;procedure c; var m: integer; function f(n: integer): integer; begin f := m+n end f; begin m := 0; b(f) end c; begin cend.過(guò)程作為參數(shù)傳遞時(shí),怎樣在該過(guò)程被激活時(shí)建立它的訪問(wèn)鏈 從b的訪問(wèn)鏈難以建立f的訪問(wèn)鏈6.3 非局部名字的訪問(wèn)progr

38、am param(input, output);(過(guò)程作為參數(shù))procedure b(function h( begin writeln(h(2) end ;procedure c; var m: integer; function f(n: integer) begin f := m+n end f; begin m := 0; b(f) end c; begin cend.訪 問(wèn) 鏈訪 問(wèn) 鏈paramcmb 6.3 非局部名字的訪問(wèn)program ret (input, output);(過(guò)程作為返回值) var f: function (integer): integer;funct

39、ion a: function (integer): integer; var m: integer; function addm (n: integer): integer; begin return m+n end; begin m:= 0; return addm end; procedure b (g: function (integer): integer); begin writeln ( g(2) end; begin f := a; b(f) end.6.3 非局部名字的訪問(wèn)program ret (input, output);(過(guò)程作為返回值) var f: functio

40、n (integer): integer;function a: function (integer): integer; var m: integer; function addm (n: integer): integer; begin return m+n end; begin m:= 0; return addm end; procedure b (g: function (integer): integer); begin writeln ( g(2) end; begin f := a; b(f) end.retabaddm6.3 非局部名字的訪問(wèn)C語(yǔ)言的函數(shù)聲明不能嵌套,函數(shù)不論

41、在什么情況下激活,要訪問(wèn)的數(shù)據(jù)分成兩種情況:非靜態(tài)局部變量(包括形式參數(shù)),它們分配在活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中外部變量(包括定義在其它源文件中的外部變量)和靜態(tài)的局部變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū) 6.3 非局部名字的訪問(wèn)6.3.3 動(dòng)態(tài)作用域被調(diào)用過(guò)程的非局部名字a和它在調(diào)用過(guò)程中引用的是同樣的存儲(chǔ)單元6.3 非局部名字的訪問(wèn)6.3.3 動(dòng)態(tài)作用域被調(diào)用過(guò)程的非局部名字a和它在調(diào)用過(guò)程中引用的是同樣的存儲(chǔ)單元新的綁定僅為被調(diào)用過(guò)程的局部名字建立,這些名字在被調(diào)用過(guò)程的活動(dòng)記錄中占用的存儲(chǔ)單元6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r:

42、 real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real;

43、begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin靜態(tài)作用域 r := 0.

44、25;0.2500.250 show; small; writeln;0.2500.250 show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin動(dòng)態(tài)作用域 r := 0.25;0.250 0.125 show;

45、small; writeln;0.250 0.125 show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非局部名字的訪問(wèn)實(shí)現(xiàn)動(dòng)態(tài)作用域的方法深訪問(wèn)用控制鏈搜索運(yùn)行棧,尋找包含該非局部名字的第一個(gè)活動(dòng)記錄淺訪問(wèn)為每個(gè)名字在靜態(tài)分配的存儲(chǔ)空間中保存它的當(dāng)前值當(dāng)過(guò)程p的新活動(dòng)出現(xiàn)時(shí),p的局部名字n使用在靜態(tài)數(shù)據(jù)區(qū)分配給n的存儲(chǔ)單元。n的先前值可以保存在p的活動(dòng)記錄中,當(dāng)p的活動(dòng)結(jié)束時(shí)再恢復(fù)6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure sho

46、w; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin (綠色表示已執(zhí)行部分) r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow?r 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方dynamicr?6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; b

47、egin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.25rdynamicr? 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r:

48、 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.25rdynamicr?show 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) en

49、d; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.25rdynamicr?smallr0.25 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end;

50、procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.125rdynamicr?smallr0.25 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方6.3 非局部名字的訪問(wèn)program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; pr

51、ocedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow0.25rdynamicr? 靜態(tài)區(qū)使用值的地方 棧區(qū)暫存值的地方6.4 參 數(shù) 傳 遞6.4.1 值調(diào)用實(shí)參的右值傳給被調(diào)用過(guò)程 值調(diào)用可以如下實(shí)現(xiàn)把形參當(dāng)作所在過(guò)程的局部名看待,形參的存儲(chǔ)單元在該過(guò)程的活動(dòng)記錄中6.4 參 數(shù) 傳 遞6.4.1 值調(diào)用實(shí)參的右值傳給被調(diào)用過(guò)程 值調(diào)用可以如

52、下實(shí)現(xiàn)把形參當(dāng)作所在過(guò)程的局部名看待,形參的存儲(chǔ)單元在該過(guò)程的活動(dòng)記錄中調(diào)用過(guò)程計(jì)算實(shí)參,并把其右值放入形參的存儲(chǔ)單元中6.4 參 數(shù) 傳 遞6.4.2 引用調(diào)用實(shí)參的左值傳給被調(diào)用過(guò)程 引用調(diào)用可以如下實(shí)現(xiàn):把形參當(dāng)作所在過(guò)程的局部名看待,形參的存儲(chǔ)單元在該過(guò)程的活動(dòng)記錄中調(diào)用過(guò)程計(jì)算實(shí)參,把實(shí)參的左值放入形參的存儲(chǔ)單元6.4 參 數(shù) 傳 遞6.4.2 引用調(diào)用實(shí)參的左值傳給被調(diào)用過(guò)程 引用調(diào)用可以如下實(shí)現(xiàn):把形參當(dāng)作所在過(guò)程的局部名看待,形參的存儲(chǔ)單元在該過(guò)程的活動(dòng)記錄中調(diào)用過(guò)程計(jì)算實(shí)參,把實(shí)參的左值放入形參的存儲(chǔ)單元在被調(diào)用過(guò)程的目標(biāo)代碼中,任何對(duì)形參的引用都是通過(guò)傳給該過(guò)程的指針來(lái)間接

53、引用實(shí)參6.4 參 數(shù) 傳 遞6.4.3 換名調(diào)用用實(shí)參表達(dá)式對(duì)形參進(jìn)行正文替換procedure s x, y: integer);var temp: integer; begin temp := x; x := y; y := temp end6.4 參 數(shù) 傳 遞6.4.3 換名調(diào)用用實(shí)參表達(dá)式對(duì)形參進(jìn)行正文替換procedure s x, y: integer);var temp: integer; begin 調(diào)用swap(i, ai) temp := x; x := y; y := temp end6.4 參 數(shù) 傳 遞6.4.3 換名調(diào)用用實(shí)參表達(dá)式對(duì)形參進(jìn)行正文替換proced

54、ure s x, y: integer);var temp: integer; begin 調(diào)用swap(i, ai) temp := x;temp := i; x := y;i := ai; y := tempai := temp end6.5 堆 管 理堆式分配堆用來(lái)存放生存期不確定的數(shù)據(jù) C+和Java允許程序員用new創(chuàng)建對(duì)象,它們的生存期沒(méi)有被約束在創(chuàng)建它們的過(guò)程活動(dòng)的生成期之內(nèi)實(shí)現(xiàn)內(nèi)存回收是內(nèi)存管理器的責(zé)任堆空間的回收有兩種不同方式 程序顯式釋放空間:free(C)或delete(C+) 垃圾收集器自動(dòng)收集(Java)6.5 堆 管 理6.5.1 內(nèi)存管理器內(nèi)存管理器把握的基本信息

55、是堆中空閑空間 分配函數(shù) 回收函數(shù)內(nèi)存管理器應(yīng)具有下列性質(zhì) 空間有效性:極小化程序需要的堆空間總量 程序有效性:較好地利用內(nèi)存子系統(tǒng),使得程序能運(yùn)行得快一些 低開(kāi)銷(xiāo):分配和回收操作所花時(shí)間在整個(gè)程序執(zhí)行時(shí)間中的比例盡量小6.5 堆 管 理6.5.2 計(jì)算機(jī)內(nèi)存分層虛擬內(nèi)存(磁盤(pán))物理內(nèi)存2級(jí)緩存1級(jí)緩存寄存器(處理器)典型大小 2千兆字節(jié)256兆2千兆字節(jié)128千4兆字節(jié)1664千字節(jié)32字典型訪問(wèn)時(shí)間315微秒100150納秒4060納秒510納秒1納秒6.5 堆 管 理6.5.2 計(jì)算機(jī)內(nèi)存分層 現(xiàn)代計(jì)算機(jī)都設(shè)計(jì)成程序員不用關(guān)心內(nèi)存子系統(tǒng)的細(xì)節(jié)就可以寫(xiě)出正確的程序 程序的效率不僅取決于被執(zhí)

56、行的指令數(shù),還取決于執(zhí)行每條指令需要多長(zhǎng)時(shí)間 執(zhí)行一條指令的時(shí)間區(qū)別非??捎^ 差異源于硬件技術(shù)的基本局限:構(gòu)造不了大容量的高速存儲(chǔ)器 數(shù)據(jù)以塊(緩存行、頁(yè))為單位在相鄰層次之間進(jìn)行傳送 數(shù)據(jù)密集型程序可從恰當(dāng)利用內(nèi)存子系統(tǒng)中獲益6.5 堆 管 理6.5.3 程序局部性大多數(shù)程序的大部分時(shí)間在執(zhí)行一小部分代碼,并且僅涉及一小部分?jǐn)?shù)據(jù)時(shí)間局部性 程序訪問(wèn)的內(nèi)存單元在很短的時(shí)間內(nèi)可能再次被程序訪問(wèn)空間局部性毗鄰被訪問(wèn)單元的內(nèi)存單元在很短的時(shí)間內(nèi)可能被訪問(wèn)6.5 堆 管 理6.5.3 程序局部性 從代碼本身很難看出哪部分代碼會(huì)被頻繁使用,必須動(dòng)態(tài)調(diào)整最快緩存的內(nèi)容 把最近使用的指令保存在緩存是一種較好

57、的最優(yōu)化利用內(nèi)存分層的策略 改變數(shù)據(jù)布局或計(jì)算次序也可以改進(jìn)程序數(shù)據(jù)訪問(wèn)的時(shí)間和空間局部性6.5 堆 管 理6.5.4 手工回收請(qǐng)求程序員在程序中顯式釋放堆塊來(lái)達(dá)到回收堆塊的目的 內(nèi)存泄漏:沒(méi)有釋放已經(jīng)引用不到的堆塊 只要內(nèi)存沒(méi)有用盡,它就不影響程序的正確性 自動(dòng)無(wú)用單元收集通過(guò)回收所有無(wú)用單元來(lái)擺脫內(nèi)存泄漏懸空引用:引用已經(jīng)被釋放的堆塊 過(guò)分熱心地釋放數(shù)據(jù)對(duì)象而引起 懸空引用容易導(dǎo)致不會(huì)被捕獲的錯(cuò)誤 本 章 要 點(diǎn)影響存儲(chǔ)分配策略的語(yǔ)言特征各種存儲(chǔ)分配策略,主要了解靜態(tài)分配和動(dòng)態(tài)棧式分配活動(dòng)記錄中各種數(shù)據(jù)域的作用和安排非局部數(shù)據(jù)訪問(wèn)的實(shí)現(xiàn)方法各種參數(shù)傳遞方式及其實(shí)現(xiàn)堆管理例 題 1一個(gè)C語(yǔ)言

58、程序及其在X86/Linux操作系統(tǒng)上的編譯結(jié)果如下。根據(jù)所生成的匯編程序來(lái)解釋程序中四個(gè)變量的存儲(chǔ)分配、作用域、生存期和置初值方式等方面的區(qū)別static long aa = 10;short bb = 20;func() static long cc = 30; short dd = 40;例 題 1.data|.align 4.align 4|.type cc.2,object.type aa,object|.size cc.2,4.size aa,4| cc.2:aa:|.long 30.long 10| .text.globl bb|.align 4.align 2| .globl

59、func .type bb,object| func:.size bb,2|. . .bb:|movw $40,-2(%ebp).value 20|. . .例 題 2main()char *cp1, *cp2;cp1 = 12345;cp2 = abcdefghij;strcpy(cp1,cp2);printf(cp1 = %sncp2 = %sn, cp1, cp2);在某些系統(tǒng)上的運(yùn)行結(jié)果是:cp1 = abcdefghijcp2 = ghij為什么cp2所指的串被修改了?例 題 2因?yàn)槌A看?2345”和“abcdefghij”連續(xù)分配在常數(shù)區(qū)執(zhí)行前:1 2 3 4 5 0 a b

60、c d e f g h i j 0 cp1 cp2例 題 2因?yàn)槌A看?2345”和“abcdefghij”連續(xù)分配在常數(shù)區(qū)執(zhí)行前:1 2 3 4 5 0 a b c d e f g h i j 0 cp1 cp2執(zhí)行后:a b c d e f g h i j 0 f g h i j 0 cp1 cp2例 題 2因?yàn)槌A看?2345”和“abcdefghij”連續(xù)分配在常數(shù)區(qū)執(zhí)行前:1 2 3 4 5 0 a b c d e f g h i j 0 cp1 cp2執(zhí)行后:a b c d e f g h i j 0 f g h i j 0 cp1 cp2現(xiàn)在的編譯器大都把程序中的串常量單獨(dú)存

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論