運(yùn)行時(shí)存儲(chǔ)空間的組織和ppt課件_第1頁(yè)
運(yùn)行時(shí)存儲(chǔ)空間的組織和ppt課件_第2頁(yè)
運(yùn)行時(shí)存儲(chǔ)空間的組織和ppt課件_第3頁(yè)
運(yùn)行時(shí)存儲(chǔ)空間的組織和ppt課件_第4頁(yè)
運(yùn)行時(shí)存儲(chǔ)空間的組織和ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩145頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第六章第六章 運(yùn)轉(zhuǎn)時(shí)存儲(chǔ)空間的組織和管理運(yùn)轉(zhuǎn)時(shí)存儲(chǔ)空間的組織和管理 術(shù)語(yǔ)術(shù)語(yǔ)過程的活動(dòng)過程的活動(dòng)過程的一次執(zhí)行稱為過程的一次活動(dòng)過程的一次執(zhí)行稱為過程的一次活動(dòng)活動(dòng)記錄活動(dòng)記錄過程的活動(dòng)需求可執(zhí)行代碼和存放所需信息過程的活動(dòng)需求可執(zhí)行代碼和存放所需信息的存儲(chǔ)空間的存儲(chǔ)空間, ,后者稱為活動(dòng)記錄后者稱為活動(dòng)記錄本章內(nèi)容本章內(nèi)容討論一個(gè)活動(dòng)記錄中的數(shù)據(jù)規(guī)劃討論一個(gè)活動(dòng)記錄中的數(shù)據(jù)規(guī)劃程序執(zhí)行過程中,一切活動(dòng)記錄的組織方式程序執(zhí)行過程中,一切活動(dòng)記錄的組織方式 第六章第六章 運(yùn)轉(zhuǎn)時(shí)存儲(chǔ)空間的組織和管理運(yùn)轉(zhuǎn)時(shí)存儲(chǔ)空間的組織和管理 影響存儲(chǔ)分配戰(zhàn)略的言語(yǔ)特征影響存儲(chǔ)分配戰(zhàn)略的言語(yǔ)特征 過程能否遞歸過程能

2、否遞歸 當(dāng)控制從過程的活動(dòng)前往時(shí),部分變量的值當(dāng)控制從過程的活動(dòng)前往時(shí),部分變量的值能否要保管能否要保管 過程能否訪問非部分變量過程能否訪問非部分變量 過程調(diào)用的參數(shù)傳送方式過程調(diào)用的參數(shù)傳送方式 過程能否作為參數(shù)被傳送過程能否作為參數(shù)被傳送 過程能否作為結(jié)果值傳送過程能否作為結(jié)果值傳送 存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)地分配存儲(chǔ)塊能否在程序控制下動(dòng)態(tài)地分配 存儲(chǔ)塊能否必需顯式地釋放存儲(chǔ)塊能否必需顯式地釋放6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配6.1.1 過程過程言語(yǔ)概念:言語(yǔ)概念:過程定義、過程調(diào)用、方式參數(shù)、真實(shí)參過程定義、過程調(diào)用、方式參數(shù)、真實(shí)參數(shù)、活動(dòng)的生存期數(shù)、活動(dòng)的生存期6.1 部分存儲(chǔ)分配

3、部分存儲(chǔ)分配6.1.2 名字的作用域和綁定名字的作用域和綁定1、名字的作用域、名字的作用域一個(gè)聲明起作用的程序部分稱為該聲明的作用一個(gè)聲明起作用的程序部分稱為該聲明的作用域域即使一個(gè)名字在程序中只聲明一次,該名字在即使一個(gè)名字在程序中只聲明一次,該名字在程序運(yùn)轉(zhuǎn)時(shí)也能夠表示不同的數(shù)據(jù)對(duì)象程序運(yùn)轉(zhuǎn)時(shí)也能夠表示不同的數(shù)據(jù)對(duì)象6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配2、環(huán)境和形狀、環(huán)境和形狀環(huán)境把名字映射到左值,而形狀把左值映射到環(huán)境把名字映射到左值,而形狀把左值映射到右值即名字到值有兩步映射右值即名字到值有兩步映射賦值改動(dòng)形狀,但不改動(dòng)環(huán)境賦值改動(dòng)形狀,但不改動(dòng)環(huán)境 過程調(diào)用改動(dòng)環(huán)境過程調(diào)用改動(dòng)環(huán)境假設(shè)環(huán)

4、境將名字假設(shè)環(huán)境將名字x映射到存儲(chǔ)單元映射到存儲(chǔ)單元s,那么說,那么說x被被綁定到綁定到s名字名字存儲(chǔ)單元存儲(chǔ)單元形狀形狀值值環(huán)境環(huán)境6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 名字的聲明名字的聲明 名字的綁定名字的綁定 6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配3、靜態(tài)概念和動(dòng)態(tài)概念的對(duì)應(yīng)、靜態(tài)

5、概念和動(dòng)態(tài)概念的對(duì)應(yīng)靜靜 態(tài)態(tài) 概概 念念 動(dòng)動(dòng) 態(tài)態(tài) 對(duì)對(duì) 應(yīng)應(yīng) 過程的定義過程的定義 過程的活動(dòng)過程的活動(dòng) 名字的聲明名字的聲明 名字的綁定名字的綁定 聲明的作用域聲明的作用域 綁定的生存期綁定的生存期 6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配6.1.3 活動(dòng)記錄活動(dòng)記錄活動(dòng)記錄的常見規(guī)劃活動(dòng)記錄的常見規(guī)劃臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)局局 部部 數(shù)數(shù) 據(jù)據(jù)機(jī)機(jī) 器器 狀狀 態(tài)態(tài)訪訪 問問 鏈鏈控控 制制 鏈鏈返返 回回 值值6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配6.1.4 部分?jǐn)?shù)據(jù)的規(guī)劃部分?jǐn)?shù)據(jù)的規(guī)劃字節(jié)是可編址內(nèi)存的最小單位字節(jié)是可編址內(nèi)存的最小單位變量所需的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確變量所需

6、的存儲(chǔ)空間可以根據(jù)其類型而靜態(tài)確定定一個(gè)過程所聲明的部分變量,按這些變量聲明一個(gè)過程所聲明的部分變量,按這些變量聲明時(shí)出現(xiàn)的次序,在部分?jǐn)?shù)據(jù)域中依次分配空時(shí)出現(xiàn)的次序,在部分?jǐn)?shù)據(jù)域中依次分配空間間部分?jǐn)?shù)據(jù)的地址可以用相對(duì)于活動(dòng)記錄中某個(gè)部分?jǐn)?shù)據(jù)的地址可以用相對(duì)于活動(dòng)記錄中某個(gè)位置的地址來表示位置的地址來表示數(shù)據(jù)對(duì)象的存儲(chǔ)規(guī)劃還有一個(gè)對(duì)齊問題數(shù)據(jù)對(duì)象的存儲(chǔ)規(guī)劃還有一個(gè)對(duì)齊問題6.1 部分存儲(chǔ)分配部分存儲(chǔ)分配 例例 在在SPARC/SolarisSPARC/Solaris任務(wù)站上下面兩個(gè)構(gòu)造任務(wù)站上下面兩個(gè)構(gòu)造體的體的sizesize分別是分別是2424和和1616,為什么不一樣?,為什么不一樣?

7、 typedef struct _atypedef struct _atypedef struct typedef struct _b_bchar char c1;c1; char char c1;c1;long long i;i; char char c2; c2;charchar c2;c2; long i; long i;double f;double f; double f;double f; a;a; b; b; 對(duì)齊:對(duì)齊:char : 1, long : 4, double : 8char : 1, long : 4, double : 86.1 部分存儲(chǔ)分配部分存儲(chǔ)分配 例例

8、在在SPARC/SolarisSPARC/Solaris任務(wù)站上下面兩個(gè)構(gòu)造任務(wù)站上下面兩個(gè)構(gòu)造體的體的sizesize分別是分別是2424和和1616,為什么不一樣?,為什么不一樣? typedef struct _atypedef struct _atypedef struct typedef struct _b_bchar char c1;c1; 0 0 char char c1;c1;0 0long long i;i;4 4 char char c2; 1 c2; 1charchar c2;c2; 8 8 long i; long i; 4 4double f;double f;161

9、6 double f; 8double f; 8 a;a; b; b; 對(duì)齊:對(duì)齊:char : 1, long : 4, double : 8char : 1, long : 4, double : 86.1 部分存儲(chǔ)分配部分存儲(chǔ)分配 例例 在在X86/LinuxX86/Linux機(jī)器的結(jié)果和機(jī)器的結(jié)果和SPARC/SolarisSPARC/Solaris任務(wù)站不一樣,是任務(wù)站不一樣,是2020和和1616。 typedef struct _atypedef struct _atypedef struct typedef struct _b_bchar char c1;c1; 0 0 cha

10、r char c1;c1;0 0long long i;i;4 4 char char c2; 1 c2; 1charchar c2;c2; 8 8 long i; long i; 4 4double f;double f;1212 double f; 8double f; 8 a;a; b; b; 對(duì)齊:對(duì)齊:char : 1, long : 4, double : 4char : 1, long : 4, double : 46.1 部分存儲(chǔ)分配部分存儲(chǔ)分配6.1.5 程序塊程序塊本身含有部分變量聲明的語(yǔ)句本身含有部分變量聲明的語(yǔ)句可以嵌套可以嵌套最接近的嵌套作用域規(guī)那么最接近的嵌套作用域

11、規(guī)那么并列程序塊不會(huì)同時(shí)活潑并列程序塊不會(huì)同時(shí)活潑并列程序塊的變量可以重疊分配并列程序塊的變量可以重疊分配6.1 部分存儲(chǔ)分配部分存儲(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ǔ)分配部分存儲(chǔ)分配main() / 例例 / / begin of B0 /

12、 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 a0b0b1a2, b3重疊分配存儲(chǔ)單元重疊分配存儲(chǔ)單元 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配本節(jié)

13、引見本節(jié)引見引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空引見程序運(yùn)轉(zhuǎn)時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配戰(zhàn)略間的分配戰(zhàn)略描畫過程的目的代碼怎樣訪問綁定到部分名字描畫過程的目的代碼怎樣訪問綁定到部分名字的存儲(chǔ)單元的存儲(chǔ)單元引見三種分配戰(zhàn)略引見三種分配戰(zhàn)略靜態(tài)分配戰(zhàn)略靜態(tài)分配戰(zhàn)略棧式分配戰(zhàn)略棧式分配戰(zhàn)略堆式分配戰(zhàn)略堆式分配戰(zhàn)略6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.1 運(yùn)轉(zhuǎn)時(shí)內(nèi)存的劃分運(yùn)轉(zhuǎn)時(shí)內(nèi)存的劃分代代 碼碼靜靜 態(tài)態(tài) 數(shù)數(shù) 據(jù)據(jù)堆堆棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、靜態(tài)分配、靜態(tài)分配名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需求名字在程序被編譯時(shí)綁定到存儲(chǔ)單元,不需求運(yùn)轉(zhuǎn)時(shí)的任何支

14、持運(yùn)轉(zhuǎn)時(shí)的任何支持綁定的生存期是程序的整個(gè)運(yùn)轉(zhuǎn)期間綁定的生存期是程序的整個(gè)運(yùn)轉(zhuǎn)期間6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、靜態(tài)分配給言語(yǔ)帶來限制、靜態(tài)分配給言語(yǔ)帶來限制遞歸過程不被允許遞歸過程不被允許數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,必?cái)?shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制,必需是在編譯時(shí)可以知道的需是在編譯時(shí)可以知道的數(shù)據(jù)構(gòu)造不能動(dòng)態(tài)建立數(shù)據(jù)構(gòu)造不能動(dòng)態(tài)建立6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 例例 C程序的外部變量、靜態(tài)部分變量以及程程序的外部變量、靜態(tài)部分變量以及程序中出現(xiàn)的常量都可以靜態(tài)分配序中出現(xiàn)的常量都可以靜態(tài)分配 聲明在函數(shù)外面聲明在函數(shù)外面 外部變量外部變量- 靜態(tài)分

15、配靜態(tài)分配 靜態(tài)外部變量靜態(tài)外部變量- 靜態(tài)分配靜態(tài)分配 聲明在函數(shù)里面聲明在函數(shù)里面 靜態(tài)部分變量靜態(tài)部分變量- 也是靜態(tài)分配也是靜態(tài)分配 自動(dòng)變量自動(dòng)變量- 不能靜態(tài)分配不能靜態(tài)分配6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.2 活動(dòng)樹和運(yùn)轉(zhuǎn)?;顒?dòng)樹和運(yùn)轉(zhuǎn)棧1、活動(dòng)樹、活動(dòng)樹用樹來描畫控制進(jìn)入和分開活動(dòng)的方式用樹來描畫控制進(jìn)入和分開活動(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ǔ)分配全局棧式存儲(chǔ)分配 活動(dòng)樹的特

16、點(diǎn)活動(dòng)樹的特點(diǎn) 每個(gè)結(jié)點(diǎn)代表某過程的一個(gè)活動(dòng)每個(gè)結(jié)點(diǎn)代表某過程的一個(gè)活動(dòng) 根結(jié)點(diǎn)代表主程序的活動(dòng)根結(jié)點(diǎn)代表主程序的活動(dòng) 結(jié)點(diǎn)結(jié)點(diǎn)a a是結(jié)點(diǎn)是結(jié)點(diǎn)b b的父結(jié)點(diǎn),當(dāng)且僅當(dāng)控制流從的父結(jié)點(diǎn),當(dāng)且僅當(dāng)控制流從a a的活動(dòng)進(jìn)入的活動(dòng)進(jìn)入b b的活動(dòng)的活動(dòng) 結(jié)點(diǎn)結(jié)點(diǎn)a a處于結(jié)點(diǎn)處于結(jié)點(diǎn)b b的左邊,當(dāng)且僅當(dāng)?shù)淖筮?,?dāng)且僅當(dāng)a a的生存期的生存期先于先于b b的生存期的生存期mq(1,9)rp(1,9)q(1,3) . . . .q(5,9) . . . .6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 當(dāng)前活潑著的過程活動(dòng)可以保管在一個(gè)棧中當(dāng)前活潑著的過程活動(dòng)可以保管在一個(gè)棧中 例例 控制棧的內(nèi)容:控制棧

17、的內(nèi)容:m, q (1, 9), q (1, m, q (1, 9), q (1, 3), q (2, 3) 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ǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過

18、程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄 main棧棧main函數(shù)調(diào)用關(guān)系樹函數(shù)調(diào)用關(guān)系樹6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄 mainr函數(shù)調(diào)用關(guān)系樹函數(shù)調(diào)用關(guān)系樹mainint ir ( )棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄

19、 mainq(1,9)r函數(shù)調(diào)用關(guān)系樹函數(shù)調(diào)用關(guān)系樹mainint iq (1, 9)int m, n棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄 mainq(1,9)rp(1,9)q(1,3)mainint iq (1, 9)int m, nint iq (1, 3)int m, n棧棧函數(shù)調(diào)用關(guān)系樹函數(shù)調(diào)用關(guān)系樹6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程、運(yùn)轉(zhuǎn)棧:把控制棧中的信息拓廣到包括過程活動(dòng)所需的一切

20、部分信息即活動(dòng)記錄活動(dòng)所需的一切部分信息即活動(dòng)記錄 mainq(1,9)rp(1,9)q(1,3)q(1,0)p(1,3)mainint iq (1, 9)int m, nint iq (1, 3)int m, nint iq (1, 0)int m, n棧棧函數(shù)調(diào)用關(guān)系樹函數(shù)調(diào)用關(guān)系樹6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.3 調(diào)用序列調(diào)用序列過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管過程調(diào)用和過程前往都需求執(zhí)行一些代碼來管理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等理活動(dòng)記錄棧,保管或恢復(fù)機(jī)器形狀等過程調(diào)用序列過程調(diào)用序列過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信息填過程調(diào)用時(shí)執(zhí)行的分配活動(dòng)記錄,把信

21、息填入它的域中,使被調(diào)用過程可以開場(chǎng)執(zhí)行的入它的域中,使被調(diào)用過程可以開場(chǎng)執(zhí)行的代碼代碼過程前往序列過程前往序列被調(diào)用過程前往時(shí)執(zhí)行的恢復(fù)機(jī)器形狀,釋被調(diào)用過程前往時(shí)執(zhí)行的恢復(fù)機(jī)器形狀,釋放被調(diào)用過程活動(dòng)記錄,使調(diào)用過程可以繼放被調(diào)用過程活動(dòng)記錄,使調(diào)用過程可以繼續(xù)執(zhí)行的代碼續(xù)執(zhí)行的代碼調(diào)用序列和前往序列經(jīng)常都分成兩部分,分處調(diào)用序列和前往序列經(jīng)常都分成兩部分,分處于調(diào)用過程和被調(diào)用過程中于調(diào)用過程和被調(diào)用過程中6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 即使是同一種言語(yǔ),過程調(diào)用序列、前往序即使是同一種言語(yǔ),過程調(diào)用序列、前往序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)嵙泻突顒?dòng)記錄中各域的排放次序

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

23、序列和活動(dòng)記錄 的一些原那么的一些原那么 普通把暫時(shí)數(shù)據(jù)域放在普通把暫時(shí)數(shù)據(jù)域放在部分?jǐn)?shù)據(jù)域的后面部分?jǐn)?shù)據(jù)域的后面 把參數(shù)域和能夠有的前往把參數(shù)域和能夠有的前往值域放在緊靠調(diào)用者活動(dòng)值域放在緊靠調(diào)用者活動(dòng)記錄的地方記錄的地方臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)局局 部部 數(shù)數(shù) 據(jù)據(jù)機(jī)機(jī) 器器 狀狀 態(tài)態(tài)訪訪 問問 鏈鏈控控 制制 鏈鏈返返 回回 值值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配 即使是同一種言語(yǔ),過程調(diào)用序列、前往序即使是同一種言語(yǔ),過程調(diào)用序列、前往序列和活動(dòng)記錄中各域的排放次序,也會(huì)因?qū)嵙泻突顒?dòng)記錄中各域的排放次序,也會(huì)因?qū)崿F(xiàn)而異現(xiàn)而異 設(shè)計(jì)這些序列和活動(dòng)記錄設(shè)計(jì)這些序列和活動(dòng)記錄

24、 的一些原那么的一些原那么 用同樣的代碼來執(zhí)行各個(gè)用同樣的代碼來執(zhí)行各個(gè)活動(dòng)的保管和恢復(fù)活動(dòng)的保管和恢復(fù)臨臨 時(shí)時(shí) 數(shù)數(shù) 據(jù)據(jù)參參 數(shù)數(shù)局局 部部 數(shù)數(shù) 據(jù)據(jù)機(jī)機(jī) 器器 狀狀 態(tài)態(tài)訪訪 問問 鏈鏈控控 制制 鏈鏈返返 回回 值值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(1) p計(jì)算實(shí)參,依計(jì)算實(shí)參,依次放入棧頂,并在

25、次放入棧頂,并在棧頂留出放前往值棧頂留出放前往值的空間。的空間。top_sp的的值在此過程中被改值在此過程中被改動(dòng)動(dòng)前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 前往值和參數(shù)前往值和參數(shù)top_sp 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(2) p把前往地址和把前往地址和當(dāng)前當(dāng)前base_sp的值的值存入存入q的活動(dòng)記錄的活動(dòng)記錄中,建立中,建立q的訪問的訪問鏈,添加鏈,添加base_sp的值的值前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫

26、時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 前往值和參數(shù)前往值和參數(shù)控制鏈和前往地址控制鏈和前往地址base_sp top_sp 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程調(diào)用過程q的調(diào)用序列的調(diào)用序列(3) q保管存放器的保管存放器的值和其它機(jī)器形狀值和其它機(jī)器形狀信息信息前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 前往值和參數(shù)前往值和參數(shù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配1、過程、過程p調(diào)用過程

27、調(diào)用過程q的調(diào)用序列的調(diào)用序列(4) q根據(jù)部分?jǐn)?shù)據(jù)根據(jù)部分?jǐn)?shù)據(jù)域和暫時(shí)數(shù)據(jù)域的域和暫時(shí)數(shù)據(jù)域的大小添加大小添加top_sp的的值,初始化它的部值,初始化它的部分?jǐn)?shù)據(jù),并開場(chǎng)執(zhí)分?jǐn)?shù)據(jù),并開場(chǎng)執(zhí)行過程體行過程體暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù) 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配調(diào)用者調(diào)用者p和被調(diào)用者和被調(diào)用者q之間的義務(wù)劃分之間的義務(wù)劃分被調(diào)用者被調(diào)用者q的責(zé)任的責(zé)任調(diào)用者調(diào)用者p的責(zé)任

28、的責(zé)任調(diào)用者調(diào)用者p的的活動(dòng)記錄活動(dòng)記錄被調(diào)用者被調(diào)用者q的活動(dòng)記錄的活動(dòng)記錄暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù) 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的前往序列的前往序列暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù) 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)

29、方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的前往序列的前往序列暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù)前往值和參數(shù) 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (1) q把前往值置入把前往值置入臨近臨近p的活動(dòng)記錄的活動(dòng)記錄的地方的地方 參數(shù)個(gè)數(shù)可變場(chǎng)參數(shù)個(gè)數(shù)可變場(chǎng)所難以確定存放前所難以確定存放前往值的位置,因此往值的

30、位置,因此通常用存放器傳送通常用存放器傳送前往值前往值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的前往序列的前往序列(2) q對(duì)應(yīng)調(diào)用序列對(duì)應(yīng)調(diào)用序列的步驟的步驟(4),減小,減小top_sp的值的值前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 前往值和參數(shù)前往值和參數(shù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的前往序列的前往序列(3) q恢復(fù)存放器恢復(fù)存放器(包包括括base_sp)和機(jī)器和機(jī)器形

31、狀,前往形狀,前往p前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 前往值和參數(shù)前往值和參數(shù)6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配2、過程、過程p調(diào)用過程調(diào)用過程q的前往序列的前往序列前往值和參數(shù)前往值和參數(shù)top_sp base_sp 暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (4) p根據(jù)參數(shù)個(gè)數(shù)根據(jù)參數(shù)個(gè)數(shù)與類型和前往值類與類型和前往值類型調(diào)整型調(diào)整top_sp,然,然后取出前往值后取出前往值6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過

32、程的參數(shù)個(gè)數(shù)可變的情況暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)參參 數(shù)數(shù)參參 數(shù)數(shù) 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (1) 函數(shù)前往值改函數(shù)前往值改成用存放器傳送成用存放器傳送6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部

33、分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (2) 編譯器產(chǎn)生將編譯器產(chǎn)生將實(shí)參表達(dá)式逆序計(jì)實(shí)參表達(dá)式逆序計(jì)算并將結(jié)果進(jìn)棧的算并將結(jié)果進(jìn)棧的代碼代碼 自上而下依次自上而下依次是參數(shù)是參數(shù)1, , 參數(shù)參數(shù)n6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (3) 被

34、調(diào)用函數(shù)能被調(diào)用函數(shù)能準(zhǔn)確地知道第一個(gè)準(zhǔn)確地知道第一個(gè)參數(shù)的位置參數(shù)的位置6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 (4) 被調(diào)用函數(shù)根被調(diào)用函數(shù)根據(jù)第一個(gè)參數(shù)到棧據(jù)第一個(gè)參數(shù)到棧中取第二、第三個(gè)中取第二、第三個(gè)參數(shù)等等參數(shù)等等6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配3、過程的參數(shù)個(gè)

35、數(shù)可變的情況、過程的參數(shù)個(gè)數(shù)可變的情況暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)參數(shù)參數(shù)1, , 參數(shù)參數(shù)n參數(shù)參數(shù)1, ,參數(shù)參數(shù)m 控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀top_sp base_sp 棧棧增增長(zhǎng)長(zhǎng)方方向向暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)暫時(shí)數(shù)據(jù)部分?jǐn)?shù)據(jù)控制鏈控制鏈 和保管的機(jī)器形狀和保管的機(jī)器形狀 C言語(yǔ)的言語(yǔ)的printf函函數(shù)就是按此方式,數(shù)就是按此方式,用用C言語(yǔ)編寫的言語(yǔ)編寫的下面語(yǔ)句的輸出?下面語(yǔ)句的輸出?printf(“%d, %d, %dn);6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.4 棧上可變長(zhǎng)數(shù)據(jù)棧上可變長(zhǎng)數(shù)據(jù)活動(dòng)記錄的長(zhǎng)度在編譯時(shí)不能確定的情況活動(dòng)記錄的長(zhǎng)度在編譯

36、時(shí)不能確定的情況例:部分?jǐn)?shù)組的大小要等到過程激活時(shí)才干確例:部分?jǐn)?shù)組的大小要等到過程激活時(shí)才干確定定備注:備注: Java言語(yǔ)的實(shí)現(xiàn)是將它們分配在堆上言語(yǔ)的實(shí)現(xiàn)是將它們分配在堆上6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針top_sp base_sp . . . . . . .棧棧(1) 編譯時(shí),編譯時(shí),在活動(dòng)記錄中在活動(dòng)記錄中為這樣的數(shù)組為這樣的數(shù)組分配存放數(shù)組分配存放數(shù)組指針的單元指針的單元6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組(2) 運(yùn)轉(zhuǎn)時(shí),運(yùn)轉(zhuǎn)時(shí),這些指針指向這

37、些指針指向分配在棧頂?shù)姆峙湓跅m數(shù)臄?shù)組存儲(chǔ)空間數(shù)組存儲(chǔ)空間控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針top_sp base_sp . . . . . . .棧棧數(shù)組數(shù)組A數(shù)組數(shù)組B6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組(3) 運(yùn)轉(zhuǎn)時(shí),運(yùn)轉(zhuǎn)時(shí),對(duì)數(shù)組對(duì)數(shù)組A和和B的訪問都要經(jīng)的訪問都要經(jīng)過相應(yīng)指針來過相應(yīng)指針來間接訪問間接訪問控制鏈控制鏈數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針top_sp base_sp . . . . . . .棧棧數(shù)組數(shù)組A數(shù)組數(shù)組B6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配訪問動(dòng)態(tài)分配的數(shù)組訪問動(dòng)態(tài)分配的數(shù)組q的數(shù)組的

38、數(shù)組q的活動(dòng)記錄的活動(dòng)記錄p的數(shù)組的數(shù)組p的活動(dòng)記錄的活動(dòng)記錄控制鏈控制鏈top_sp base_sp 數(shù)組數(shù)組A的指針的指針數(shù)組數(shù)組B的指針的指針數(shù)組數(shù)組A數(shù)組數(shù)組B控制鏈控制鏈. . . . . . .棧棧6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.5 懸空援用懸空援用懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元6.2 全局棧式存儲(chǔ)分配全局棧式存儲(chǔ)分配6.2.5 懸空援用懸空援用懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元懸空援用:援用某個(gè)已被釋放的存儲(chǔ)單元例:例:main中援用中援用p指向的對(duì)象指向的對(duì)象main( ) |int dangle ( ) int q;

39、|int j = 20; q = dangle ( ); |return &j;|6.3 非部分名字的訪問非部分名字的訪問本節(jié)引見本節(jié)引見無過程嵌套的靜態(tài)作用域無過程嵌套的靜態(tài)作用域C C言語(yǔ)言語(yǔ)有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域PascalPascal言語(yǔ)言語(yǔ)動(dòng)態(tài)作用域動(dòng)態(tài)作用域LispLisp言語(yǔ)言語(yǔ)6.3 非部分名字的訪問非部分名字的訪問6.3.1 無過程嵌套的靜態(tài)作用域無過程嵌套的靜態(tài)作用域過程體中的非部分援用可以直接運(yùn)用靜態(tài)確定過程體中的非部分援用可以直接運(yùn)用靜態(tài)確定的地址非部分?jǐn)?shù)據(jù)此時(shí)就是全局?jǐn)?shù)據(jù)的地址非部分?jǐn)?shù)據(jù)此時(shí)就是全局?jǐn)?shù)據(jù)部分變量在棧頂?shù)幕顒?dòng)記錄中,可以經(jīng)過

40、部分變量在棧頂?shù)幕顒?dòng)記錄中,可以經(jīng)過base_sp指針來訪問指針來訪問無須深化棧中取數(shù)據(jù),無須訪問鏈無須深化棧中取數(shù)據(jù),無須訪問鏈過程可以作為參數(shù)來傳送,也可以作為結(jié)果來過程可以作為參數(shù)來傳送,也可以作為結(jié)果來前往前往6.3 非部分名字的訪問非部分名字的訪問6.3.2 有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域sortreadarrayexchangequicksortpartition6.3 非部分名字的訪問非部分名字的訪問6.3.2 有過程嵌套的靜態(tài)作用域有過程嵌套的靜態(tài)作用域過程嵌套深度過程嵌套深度sort1readarray2exchange2quicksort2partition3

41、變量的嵌套深度:它的聲明所在過程的嵌套變量的嵌套深度:它的聲明所在過程的嵌套深度作為該名字的嵌套深度深度作為該名字的嵌套深度 訪問鏈訪問鏈 用來尋覓非部分用來尋覓非部分 名字的存儲(chǔ)單元名字的存儲(chǔ)單元sa, xq (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈e (1, 3)訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈6.3 非

42、部分名字的訪問非部分名字的訪問6.3 非部分名字的訪問非部分名字的訪問 訪問非部分名字的存儲(chǔ)單元訪問非部分名字的存儲(chǔ)單元 假定過程假定過程p p的嵌套深度為的嵌套深度為npnp,它援用嵌套,它援用嵌套深度為深度為nana 的變量的變量a a,na na np np,如何訪問,如何訪問a a的存儲(chǔ)單元的存儲(chǔ)單元 sortsort1 1readarrayreadarray2 2exchangeexchange2 2quicksortquicksort2 2partitionpartition3 3sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈6.3 非部分名字的

43、訪問非部分名字的訪問 訪問非部分名字的存儲(chǔ)單元訪問非部分名字的存儲(chǔ)單元 假定過程假定過程p p的嵌套深度為的嵌套深度為npnp,它援用嵌套,它援用嵌套深度為深度為nana 的變量的變量a a,na na np np,如何訪問,如何訪問a a的存儲(chǔ)單元的存儲(chǔ)單元 從棧頂?shù)幕顒?dòng)記錄開場(chǎng),追蹤訪問鏈從棧頂?shù)幕顒?dòng)記錄開場(chǎng),追蹤訪問鏈np np nana次次 到達(dá)到達(dá)a a的聲明所在過程的活動(dòng)記錄的聲明所在過程的活動(dòng)記錄 訪問鏈的追蹤用間接操作就可完成訪問鏈的追蹤用間接操作就可完成 sortsort1 1readarrayreadarray2 2exchangeexchange2 2quicksortq

44、uicksort2 2partitionpartition3 3sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈 訪問非部分名字的存儲(chǔ)單元訪問非部分名字的存儲(chǔ)單元 sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈e (1, 3)訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪

45、問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈6.3 非部分名字的訪問非部分名字的訪問6.3 非部分名字的訪問非部分名字的訪問 過程過程p p對(duì)變量對(duì)變量a a訪問時(shí),訪問時(shí),a a的地址由下面的二元的地址由下面的二元組表示:組表示: np np na na,a a在活動(dòng)記錄中的偏移在活動(dòng)記錄中的偏移6.3 非部分名字的訪問非部分名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為npnp的過程的過程p p調(diào)用嵌套深度為調(diào)用嵌套深度為nxnx的過程的過程x x(1) np nx(1) np nx的情況的情況sortsort1 1readarrayread

46、array2 2exchangeexchange2 2quicksortquicksort2 2partitionpartition3 3 這時(shí)這時(shí)x一定一定就聲明在就聲明在p中中6.3 非部分名字的訪問非部分名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為npnp的過程的過程p p調(diào)用嵌套深度為調(diào)用嵌套深度為nxnx的過程的過程x x(1) np nx(1) np nx的情況的情況 被調(diào)用過程的訪問鏈必需指向調(diào)用過程的活被調(diào)用過程的訪問鏈必需指向調(diào)用過程的活動(dòng)記錄的訪問鏈動(dòng)記錄的訪問鏈 訪問非部分名字的存儲(chǔ)單元訪問非部分名字的存儲(chǔ)單元 sort readarray exchan

47、ge quicksort partitionsa, xq (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈e (1, 3)訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈p (1, 3)i, j訪問鏈訪問鏈6.3 非部分名字的訪問非部分名字的訪問6.3 非部分名字的訪問非部分名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為npnp的過程的過程p p調(diào)用嵌

48、套深度為調(diào)用嵌套深度為nxnx的過程的過程x x(2) np (2) np nx nx的情況的情況sortsort1 1readarrayreadarray2 2exchangeexchange2 2quicksortquicksort2 2partitionpartition3 3 這時(shí)這時(shí)p和和x的的嵌套深度分別嵌套深度分別為為1,2,nx 1的外圍的外圍過程一定一樣過程一定一樣6.3 非部分名字的訪問非部分名字的訪問 建立訪問鏈建立訪問鏈 假定嵌套深度為假定嵌套深度為npnp的過程的過程p p調(diào)用嵌套深度為調(diào)用嵌套深度為nxnx的過程的過程x x(2) np (2) np nx nx的情

49、況的情況 追蹤訪問鏈追蹤訪問鏈np np nx + 1 nx + 1次,到達(dá)了靜態(tài)包次,到達(dá)了靜態(tài)包圍圍x x和和p p的且離它們最近的那個(gè)過程的最新活的且離它們最近的那個(gè)過程的最新活動(dòng)記錄動(dòng)記錄 所到達(dá)的活動(dòng)記錄就是所到達(dá)的活動(dòng)記錄就是x x的活動(dòng)記錄中的訪問的活動(dòng)記錄中的訪問鏈應(yīng)該指向的那個(gè)活動(dòng)記錄鏈應(yīng)該指向的那個(gè)活動(dòng)記錄 訪問非部分名字的存儲(chǔ)單元訪問非部分名字的存儲(chǔ)單元 sort readarray exchange quicksort partitionsa, xq (1, 9)k, v訪問鏈訪問鏈sa, xq (1, 3)k, v訪問鏈訪問鏈q (1, 9)k, v訪問鏈訪問鏈sa,

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

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

52、on f(n: integer) begin f := m+n end f; begin m := 0; b(f) end c; begin cend. 從從b的訪問鏈難以的訪問鏈難以建立建立f的訪問鏈的訪問鏈訪訪 問問 鏈鏈訪訪 問問 鏈鏈paramcmb 6.3 非部分名字的訪問非部分名字的訪問program param(input, output);過程作為參數(shù)過程作為參數(shù)procedure b(function h( begin writeln(h(2) end ;procedure c; var m: integer; function f(n: integer) begin f :

53、= m+n end f; begin m := 0; b(f) end c; begin cend. f作為參數(shù)傳送時(shí),作為參數(shù)傳送時(shí),它的起始地址連同它它的起始地址連同它的訪問鏈一同傳送的訪問鏈一同傳送訪訪 問問 鏈鏈訪訪 問問 鏈鏈paramcmb 6.3 非部分名字的訪問非部分名字的訪問program param(input, output);過程作為參數(shù)過程作為參數(shù)procedure b(function h( begin writeln(h(2) end ;procedure c; var m: integer; function f(n: integer) begin f := m

54、+n end f; begin m := 0; b(f) end c; begin cend. b調(diào)用調(diào)用f時(shí),用傳送時(shí),用傳送過來的訪問鏈來建立過來的訪問鏈來建立f的訪問鏈的訪問鏈訪訪 問問 鏈鏈訪訪 問問 鏈鏈paramcmb 訪訪 問問 鏈鏈b6.3 非部分名字的訪問非部分名字的訪問program ret (input, output);過程作為前往值過程作為前往值 var f: function (integer): integer;function a: function (integer): integer; var m: integer; function addm (n: in

55、teger): 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.aretbaddm6.3 非部分名字的訪問非部分名字的訪問program ret (input, output);過程作為前往值過程作為前往值 var f: function (integer): integer;function a: function (integer)

56、: 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.aretbaddm 執(zhí)行執(zhí)行addm時(shí),時(shí),a的活動(dòng)記錄已不存的活動(dòng)記錄已不存在,取不到在,取不到m的值的值6.3 非部分名字的訪問非部分名字的訪問 C言語(yǔ)的函數(shù)聲明不能嵌套,函數(shù)

57、不論在什言語(yǔ)的函數(shù)聲明不能嵌套,函數(shù)不論在什么情況下激活,要訪問的數(shù)據(jù)分成兩種情況么情況下激活,要訪問的數(shù)據(jù)分成兩種情況 非靜態(tài)部分變量包括方式參數(shù),它們分非靜態(tài)部分變量包括方式參數(shù),它們分配在活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中配在活動(dòng)記錄棧頂?shù)哪莻€(gè)活動(dòng)記錄中 外部變量包括定義在其它源文件之中的外外部變量包括定義在其它源文件之中的外部變量和靜態(tài)的部分變量,它們都分配在部變量和靜態(tài)的部分變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū)靜態(tài)數(shù)據(jù)區(qū) 因此因此C言語(yǔ)允許函數(shù)的指針作為前往值言語(yǔ)允許函數(shù)的指針作為前往值6.3 非部分名字的訪問非部分名字的訪問6.3.3 動(dòng)態(tài)作用域動(dòng)態(tài)作用域被調(diào)用過程的非部分名字被調(diào)用過程的非部分

58、名字a和它在調(diào)用過程中援和它在調(diào)用過程中援用的是同樣的存儲(chǔ)單元用的是同樣的存儲(chǔ)單元基于運(yùn)轉(zhuǎn)時(shí)的調(diào)用關(guān)系基于運(yùn)轉(zhuǎn)時(shí)的調(diào)用關(guān)系而不是基于靜態(tài)作用域來確定而不是基于靜態(tài)作用域來確定新的綁定僅為被調(diào)用過程的部分名字建立,這新的綁定僅為被調(diào)用過程的部分名字建立,這些名字在被調(diào)用過程的活動(dòng)記錄中占用存儲(chǔ)些名字在被調(diào)用過程的活動(dòng)記錄中占用存儲(chǔ)單元單元這一點(diǎn)與靜態(tài)作用域沒有區(qū)別這一點(diǎn)與靜態(tài)作用域沒有區(qū)別6.3 非部分名字的訪問非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end

59、; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end.dynamicshowsmallsmallshowshowshow6.3 非部分名字的訪問非部分名字的訪問program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論