第章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理編譯原理中國(guó)科_第1頁(yè)
第章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理編譯原理中國(guó)科_第2頁(yè)
第章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理編譯原理中國(guó)科_第3頁(yè)
第章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理編譯原理中國(guó)科_第4頁(yè)
第章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理編譯原理中國(guó)科_第5頁(yè)
已閱讀5頁(yè),還剩145頁(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)介

編譯原理和技術(shù)中國(guó)科學(xué)技術(shù)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院陳意云第六章運(yùn)行時(shí)存儲(chǔ)空間的組織和管理

術(shù)語(yǔ)過(guò)程的活動(dòng)

過(guò)程的一次執(zhí)行稱為過(guò)程的一次活動(dòng)活動(dòng)記錄 過(guò)程的活動(dòng)需要可執(zhí)行代碼和存放所需信息的存儲(chǔ)空間,后者稱為活動(dòng)記錄本章內(nèi)容討論一個(gè)活動(dòng)記錄中的數(shù)據(jù)布局程序執(zhí)行過(guò)程中,所有活動(dòng)記錄的組織方式

第六章運(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ò)程語(yǔ)言概念: 過(guò)程定義、過(guò)程調(diào)用、形式參數(shù)、實(shí)在參數(shù)、活動(dòng)的生存期6.1

局部存儲(chǔ)分配6.1.2名字的作用域和綁定1、名字的作用域一個(gè)聲明起作用的程序部分稱為該聲明的作用域即使一個(gè)名字在程序中只聲明一次,該名字在程序運(yùn)行時(shí)也可能表示不同的數(shù)據(jù)對(duì)象6.1

局部存儲(chǔ)分配2、環(huán)境和狀態(tài)環(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.1

局部存儲(chǔ)分配3、靜態(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ǔ)分配3、靜態(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ǔ)分配3、靜態(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ù)數(shù)據(jù)的布局局字節(jié)是可編編址內(nèi)存的的最小單位位變量所需的的存儲(chǔ)空間間可以根據(jù)據(jù)其類型而而靜態(tài)確定定一個(gè)過(guò)程所所聲明的局局部變量,,按這些變變量聲明時(shí)時(shí)出現(xiàn)的次次序,在局局部數(shù)據(jù)域域中依次分分配空間局部數(shù)據(jù)的的地址可以以用相對(duì)于于活動(dòng)記錄錄中某個(gè)位位置的地址址來(lái)表示數(shù)據(jù)對(duì)象的的存儲(chǔ)布局局還有一個(gè)個(gè)對(duì)齊問(wèn)題題6.1局部存儲(chǔ)分分配例 在SPARC/Solaris工作站上下下面兩個(gè)結(jié)結(jié)構(gòu)體的size分別是24和16,為什么不不一樣?typedefstruct_a{typedefstruct_b{charc1;charc1;longi;char c2;charc2;longi;doublef;doublef;}a;}b;對(duì)齊:char:1,long:4,double:86.1局部存儲(chǔ)分分配例 在SPARC/Solaris工作站上下下面兩個(gè)結(jié)結(jié)構(gòu)體的size分別是24和16,為什么不不一樣?typedefstruct_a{typedefstruct_b{charc1;0charc1;0longi;4charc2;1charc2;8longi;4doublef;16doublef;8}a;}b;對(duì)齊:char:1,long:4,double:86.1局部存儲(chǔ)分分配例 在X86/Linux機(jī)器的結(jié)果果和SPARC/Solaris工作站不一一樣,是20和16。typedefstruct_a{typedefstruct_b{charc1;0charc1;0longi;4charc2;1charc2;8longi;4doublef;12doublef;8}a;}b;對(duì)齊:char:1,long:4,double:46.1局部存儲(chǔ)分分配6.1.5程序塊本身含有局局部變量聲聲明的語(yǔ)句句可以嵌套最接近的嵌嵌套作用域規(guī)則則并列程序塊塊不會(huì)同時(shí)時(shí)活躍并列程序塊塊的變量可可以重疊分分配6.1局部存儲(chǔ)分分配main()/例/{/beginofB0/inta=0;intb=0;{/beginofB1/intb=1;{/beginofB2/inta=2;}/endofB2/{/beginofB3/intb=3;}/endofB3/}/endofB1/}/endofB0/6.1局部存儲(chǔ)分分配main()/例/{/beginofB0/inta=0;intb=0;{/beginofB1/intb=1;{/beginofB2/inta=2;}/endofB2/{/beginofB3/intb=3;}/endofB3/}/endofB1/}/endofB0/聲

inta=0;B0

B2

intb=0;B0

B1

intb=1;B1

B3

inta=2;B2intb=3;B3

a0b0b1a2,b3重疊分配存儲(chǔ)單元

6.2全局局棧棧式式存存儲(chǔ)儲(chǔ)分分配配本節(jié)介紹紹介紹程序序運(yùn)行時(shí)時(shí)所需的的各個(gè)活活動(dòng)記錄錄在存儲(chǔ)儲(chǔ)空間的的分配策策略描述過(guò)程程的目標(biāo)標(biāo)代碼怎怎樣訪問(wèn)問(wèn)綁定到到局部名名字的存存儲(chǔ)單元元介紹三種種分配策策略靜態(tài)分配配策略棧式分配配策略堆式分配配策略6.2全局棧式式存儲(chǔ)分分配6.2.1運(yùn)行時(shí)內(nèi)內(nèi)存的劃劃分代碼靜態(tài)數(shù)據(jù)堆棧6.2全局棧式式存儲(chǔ)分分配1、靜態(tài)分分配名字在程程序被編編譯時(shí)綁綁定到存存儲(chǔ)單元元,不需需要運(yùn)行行時(shí)的任任何支持持綁定的生生存期是是程序的的整個(gè)運(yùn)運(yùn)行期間間6.2全局棧式式存儲(chǔ)分分配2、靜態(tài)分分配給語(yǔ)語(yǔ)言帶來(lái)來(lái)限制遞歸過(guò)程程不被允允許數(shù)據(jù)對(duì)象象的長(zhǎng)度度和它在在內(nèi)存中中位置的的限制,,必須是是在編譯譯時(shí)可以以知道的的數(shù)據(jù)結(jié)構(gòu)構(gòu)不能動(dòng)動(dòng)態(tài)建立立6.2全局棧式式存儲(chǔ)分分配例C程序的外外部變量量、靜態(tài)態(tài)局部變變量以及及程序中中出現(xiàn)的的常量都都可以靜靜態(tài)分配配聲明在函函數(shù)外面面外部變量量--靜態(tài)分配配靜態(tài)外部部變量--靜態(tài)分配配聲明在函函數(shù)里面面靜態(tài)局部部變量--也是靜態(tài)態(tài)分配自動(dòng)變量量--不能靜態(tài)態(tài)分配6.2全局棧式式存儲(chǔ)分分配活動(dòng)樹和和運(yùn)行棧棧1、活動(dòng)樹樹用樹來(lái)描描繪控制制進(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ǔ)分分配活動(dòng)樹的的特點(diǎn)每個(gè)結(jié)點(diǎn)點(diǎn)代表某某過(guò)程的的一個(gè)活活動(dòng)根結(jié)點(diǎn)代代表主程程序的活活動(dòng)結(jié)點(diǎn)a是結(jié)點(diǎn)b的父結(jié)點(diǎn)點(diǎn),當(dāng)且且僅當(dāng)控控制流從從a的活動(dòng)進(jìn)進(jìn)入b的活動(dòng)結(jié)點(diǎn)a處于結(jié)點(diǎn)點(diǎn)b的左邊,,當(dāng)且僅僅當(dāng)a的生存期期先于b的生存期期mq(1,9)rp(1,9)q(1,3)....q(5,9)....6.2全局棧式式存儲(chǔ)分分配當(dāng)前活躍躍著的過(guò)過(guò)程活動(dòng)動(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ǔ)分分配2、運(yùn)行棧棧:把控制棧棧中的信信息拓廣廣到包括括過(guò)程活活動(dòng)所需需的所有有局部信信息(即即活動(dòng)記記錄)6.2全局棧式式存儲(chǔ)分分配2、運(yùn)行棧棧:把控制棧棧中的信信息拓廣廣到包括括過(guò)程活活動(dòng)所需需的所有有局部信信息(即即活動(dòng)記記錄)ma:arraym6.2全局棧式式存儲(chǔ)分分配2、運(yùn)行棧棧:把控制棧棧中的信信息拓廣廣到包括括過(guò)程活活動(dòng)所需需的所有有局部信信息(即即活動(dòng)記記錄)mi:integerra:arraymr6.2全局棧式式存儲(chǔ)分分配2、運(yùn)行棧棧:把控制棧棧中的信信息拓廣廣到包括括過(guò)程活活動(dòng)所需需的所有有局部信信息(即即活動(dòng)記記錄)mk:integerq(1,9)a:arraymq(1,9)r6.2全局棧式式存儲(chǔ)分分配2、運(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)p(1,3)6.2全局棧式式存儲(chǔ)分分配調(diào)用序列列過(guò)程調(diào)用用和過(guò)程程返回都都需要執(zhí)執(zhí)行一些些代碼來(lái)來(lái)管理活活動(dòng)記錄錄棧,保保存或恢恢復(fù)機(jī)器器狀態(tài)等等過(guò)程調(diào)用用序列過(guò)程調(diào)用用時(shí)執(zhí)行行的分配配活動(dòng)記記錄,把把信息填填入它的的域中,,使被調(diào)調(diào)用過(guò)程程可以開開始執(zhí)行行的代碼碼過(guò)程返回回序列被調(diào)用過(guò)過(guò)程返回回時(shí)執(zhí)行行的恢復(fù)復(fù)機(jī)器狀狀態(tài),釋釋放被調(diào)調(diào)用過(guò)程程活動(dòng)記記錄,使使調(diào)用過(guò)過(guò)程能夠夠繼續(xù)執(zhí)執(zhí)行的代代碼調(diào)用序列列和返回回序列常常都分分成兩部部分,分分處于調(diào)調(diào)用過(guò)程程和被調(diào)調(diào)用過(guò)程程中6.2全局棧式式存儲(chǔ)分分配即使是同同一種語(yǔ)語(yǔ)言,過(guò)過(guò)程調(diào)用用序列、、返回序序列和活活動(dòng)記錄錄中各域域的排放放次序,,也會(huì)因因?qū)崿F(xiàn)而而異設(shè)計(jì)這些些序列和和活動(dòng)記記錄的一些原原則以活動(dòng)記記錄中間間的某個(gè)個(gè)位置作為為基地址址長(zhǎng)度能較較早確定定的域放放在活動(dòng)記錄錄的中間間返回值臨時(shí)數(shù)據(jù)參數(shù)控制鏈訪問(wèn)鏈機(jī)器狀態(tài)局部數(shù)據(jù)6.2全局棧式式存儲(chǔ)分分配即使是同同一種語(yǔ)語(yǔ)言,過(guò)過(guò)程調(diào)用用序列、、返回序序列和活活動(dòng)記錄錄中各域域的排放放次序,,也會(huì)因因?qū)崿F(xiàn)而而異設(shè)計(jì)這些些序列和和活動(dòng)記記錄的一些原原則一般把臨臨時(shí)數(shù)據(jù)據(jù)域放在在局部數(shù)據(jù)據(jù)域的后后面把參數(shù)域域和可能能有的返返回值域放在在緊靠調(diào)調(diào)用者活活動(dòng)記錄的地地方返回值臨時(shí)數(shù)據(jù)參數(shù)控制鏈訪問(wèn)鏈機(jī)器狀態(tài)局部數(shù)據(jù)6.2全局棧式式存儲(chǔ)分分配即使是同同一種語(yǔ)語(yǔ)言,過(guò)過(guò)程調(diào)用用序列、、返回序序列和活活動(dòng)記錄錄中各域域的排放放次序,,也會(huì)因因?qū)崿F(xiàn)而而異設(shè)計(jì)這些些序列和和活動(dòng)記記錄的一些原原則用同樣的的代碼來(lái)來(lái)執(zhí)行各各個(gè)活動(dòng)的保保存和恢恢復(fù)返回值臨時(shí)數(shù)據(jù)參數(shù)控制鏈訪問(wèn)鏈機(jī)器狀態(tài)局部數(shù)據(jù)6.2全局棧式式存儲(chǔ)分分配1、過(guò)程p調(diào)用過(guò)程程q的調(diào)用序序列返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

6.2全局棧式式存儲(chǔ)分分配1、過(guò)程p調(diào)用過(guò)程程q的調(diào)用序序列(1)p計(jì)算實(shí)實(shí)參,,依次次放入入棧頂頂,并并在棧棧頂留留出放放返回回值的的空間間。top_sp的值在在此過(guò)過(guò)程中中被改改變返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

返回值和參數(shù)top_sp

6.2全局棧棧式存存儲(chǔ)分分配1、過(guò)程程p調(diào)用過(guò)過(guò)程q的調(diào)用用序列列(2)p把返回回地址址和當(dāng)當(dāng)前base_sp的值存存入q的活動(dòng)動(dòng)記錄錄中,,建立立q的訪問(wèn)問(wèn)鏈,,增加加base_sp的值返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

返回值和參數(shù)控制鏈和返回地址base_sp

top_sp

6.2全局棧棧式存存儲(chǔ)分分配1、過(guò)程程p調(diào)用過(guò)過(guò)程q的調(diào)用用序列列(3)q保存存寄存存器的的值和和其它它機(jī)器器狀態(tài)態(tài)信息息返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

返回值和參數(shù)控制鏈和保存的機(jī)器狀態(tài)6.2全局棧棧式存存儲(chǔ)分分配1、過(guò)程程p調(diào)用過(guò)過(guò)程q的調(diào)用用序列列(4)q根據(jù)局局部數(shù)數(shù)據(jù)域域和臨臨時(shí)數(shù)數(shù)據(jù)域域的大大小增增加top_sp的值,,初始始化它它的局局部數(shù)數(shù)據(jù),,并開開始執(zhí)執(zhí)行過(guò)過(guò)程體體臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

6.2全局棧棧式存存儲(chǔ)分分配調(diào)用者者p和被調(diào)調(diào)用者者q之間的的任務(wù)務(wù)劃分分被調(diào)用者q的責(zé)任調(diào)用者p的責(zé)任調(diào)用者p的活動(dòng)記錄被調(diào)用者q的活動(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ǔ)分分配2、過(guò)程程p調(diào)用過(guò)過(guò)程q的返回回序列列臨時(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ǔ)分分配2、過(guò)程程p調(diào)用過(guò)過(guò)程q的返回回序列列臨時(shí)數(shù)據(jù)局部數(shù)據(jù)返回值和參數(shù)返回值和參數(shù)

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(1)q把返返回值值置入入鄰近近p的的活動(dòng)動(dòng)記錄錄的地地方參數(shù)個(gè)個(gè)數(shù)可可變場(chǎng)場(chǎng)合難難以確確定存存放返返回值值的位位置,,因此此通常常用寄寄存器器傳遞遞返回回值6.2全局棧棧式存存儲(chǔ)分分配2、過(guò)程程p調(diào)用過(guò)過(guò)程q的返回回序列列(2)q對(duì)應(yīng)調(diào)調(diào)用序序列的的步驟驟(4),減小小top_sp的值返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

返回值和參數(shù)控制鏈和保存的機(jī)器狀態(tài)6.2全局棧棧式存存儲(chǔ)分分配2、過(guò)程程p調(diào)用過(guò)過(guò)程q的返回回序列列(3)q恢復(fù)寄寄存器器(包括base_sp)和機(jī)器器狀態(tài)態(tài),返返回p返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

返回值和參數(shù)6.2全局棧棧式存存儲(chǔ)分分配2、過(guò)程程p調(diào)用過(guò)過(guò)程q的返回回序列列返回值和參數(shù)top_sp

base_sp

臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(4)p根據(jù)參參數(shù)個(gè)個(gè)數(shù)與與類型型和返返回值值類型型調(diào)整整top_sp,然后取取出返返回值值6.2全局棧棧式存存儲(chǔ)分分配3、過(guò)過(guò)程的的參數(shù)數(shù)個(gè)數(shù)數(shù)可變變的情情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)參數(shù)

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(1)函函數(shù)返返回值值改成成用寄寄存器器傳遞遞6.2全局棧棧式存存儲(chǔ)分分配3、過(guò)過(guò)程的的參數(shù)數(shù)個(gè)數(shù)數(shù)可變變的情情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)1,…,參數(shù)n參數(shù)1,…,參數(shù)m

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(2)編編譯器器產(chǎn)生生將實(shí)實(shí)參表表達(dá)式式逆序序計(jì)算算并將將結(jié)果果進(jìn)棧棧的代代碼自上而而下依依次是是參數(shù)數(shù)1,……,參參數(shù)數(shù)n6.2全局棧棧式存存儲(chǔ)分分配3、過(guò)過(guò)程的的參數(shù)數(shù)個(gè)數(shù)數(shù)可變變的情情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)1,…,參數(shù)n參數(shù)1,…,參數(shù)m

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(3)被被調(diào)用用函數(shù)數(shù)能準(zhǔn)準(zhǔn)確地地知道道第一一個(gè)參參數(shù)的的位置置6.2全局棧棧式存存儲(chǔ)分分配3、過(guò)過(guò)程的的參數(shù)數(shù)個(gè)數(shù)數(shù)可變變的情情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)1,…,參數(shù)n參數(shù)1,…,參數(shù)m

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

(4)被被調(diào)用用函數(shù)數(shù)根據(jù)據(jù)第一一個(gè)參參數(shù)到到棧中中取第第二、、第三三個(gè)參參數(shù)等等等6.2全局棧棧式存存儲(chǔ)分分配3、過(guò)過(guò)程的的參數(shù)數(shù)個(gè)數(shù)數(shù)可變變的情情況臨時(shí)數(shù)據(jù)局部數(shù)據(jù)參數(shù)1,…,參數(shù)n參數(shù)1,…,參數(shù)m

控制鏈和保存的機(jī)器狀態(tài)top_sp

base_sp

棧增長(zhǎng)方向臨時(shí)數(shù)據(jù)局部數(shù)據(jù)控制鏈和保存的機(jī)器狀態(tài)

C語(yǔ)言言的printf函函數(shù)就是是按此此方式式,用C語(yǔ)語(yǔ)言編編寫的的下面語(yǔ)語(yǔ)句的的輸出出?printf(“%d,%d,%d\n””);6.2全局棧棧式存存儲(chǔ)分分配棧上可可變長(zhǎng)長(zhǎng)數(shù)據(jù)據(jù)活動(dòng)記記錄的的長(zhǎng)度度在編編譯時(shí)時(shí)不能能確定定的情例:局部數(shù)組的大小要等到過(guò)程激活時(shí)才能確定備注:

Java語(yǔ)言的實(shí)現(xiàn)是將它們分配在堆上6.2全局棧棧式存存儲(chǔ)分分配訪問(wèn)動(dòng)動(dòng)態(tài)分分配的的數(shù)組組控制鏈數(shù)組A的指針數(shù)組B的指針top_sp

base_sp

.........棧(1)編編譯時(shí)時(shí),在在活動(dòng)動(dòng)記錄錄中為為這樣樣的數(shù)數(shù)組分分配存存放數(shù)數(shù)組指指針的的單元元6.2全局棧棧式存存儲(chǔ)分分配訪問(wèn)動(dòng)動(dòng)態(tài)分分配的的數(shù)組組(2)運(yùn)運(yùn)行時(shí)時(shí),這這些指指針指指向分分配在在棧頂頂?shù)臄?shù)數(shù)組存存儲(chǔ)空空間控制鏈數(shù)組A的指針數(shù)組B的指針top_sp

base_sp

.........棧數(shù)組A數(shù)組B6.2全局棧棧式存存儲(chǔ)分分配訪問(wèn)動(dòng)動(dòng)態(tài)分分配的的數(shù)組組(3)運(yùn)運(yùn)行時(shí)時(shí),對(duì)對(duì)數(shù)組組A和和B的的訪問(wèn)問(wèn)都要要通過(guò)過(guò)相應(yīng)應(yīng)指針針來(lái)間間接訪訪問(wèn)控制鏈數(shù)組A的指針數(shù)組B的指針top_sp

base_sp

.........棧數(shù)組A數(shù)組B6.2全局棧棧式存存儲(chǔ)分分配訪問(wèn)動(dòng)動(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ǔ)分分配懸空引引用懸空引引用::引用某某個(gè)已已被釋釋放的的存儲(chǔ)儲(chǔ)單元元6.2全局棧棧式存存儲(chǔ)分分配懸空引引用懸空引引用::引用某某個(gè)已已被釋釋放的的存儲(chǔ)儲(chǔ)單元元例:main中引用用p指向的的對(duì)象象main(){|intdangle(){intq;|intj=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)過(guò)程體中的非局部引用可以直接使用靜態(tài)確定的地址(非局部數(shù)據(jù)此時(shí)就是全局?jǐn)?shù)據(jù))局部變量在棧頂?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)6.3.2有過(guò)程嵌套套的靜態(tài)作作用域過(guò)程嵌套深度sort1readarray 2exchange2quicksort 2partition 3變量的嵌套深度作為該名字的嵌套深度訪問(wèn)鏈用來(lái)尋尋找非非局部部名字的的存儲(chǔ)儲(chǔ)單元元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,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)問(wèn)6.3非局部部名字字的訪訪問(wèn)訪問(wèn)非非局部部名字字的存存儲(chǔ)單單元假定過(guò)過(guò)程p的嵌套套深度度為np,它引用用嵌套套深度度為na的變量量a,nanp,如何何訪問(wèn)問(wèn)a的存儲(chǔ)儲(chǔ)單元元sort1readarray2exchange2quicksort2partition3sa,xq(1,3)k,v訪問(wèn)鏈q(1,9)k,v訪問(wèn)鏈6.3非局部部名字字的訪訪問(wèn)訪問(wèn)非非局部部名字字的存存儲(chǔ)單單元假定過(guò)過(guò)程p的嵌套套深度度為np,它引用用嵌套套深度度為na的變量a,nanp,如何訪問(wèn)a的存儲(chǔ)單元從棧頂?shù)幕顒?dòng)動(dòng)記錄開始,,追蹤訪問(wèn)鏈鏈npna次到達(dá)a的聲明所在過(guò)過(guò)程的活動(dòng)記記錄訪問(wèn)鏈的追蹤蹤用間接操作作就可完成sort1readarray2exchange2quicksort2partition3sa,xq(1,3)k,v訪問(wèn)鏈q(1,9)k,v訪問(wèn)鏈訪問(wèn)非局部名名字的存儲(chǔ)單單元sortreadarrayexchangequicksortpartitionsa,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,3)i,j訪問(wèn)鏈6.3非非局部名字的的訪問(wèn)6.3非局部名字的的訪問(wèn)過(guò)程p對(duì)變量a訪問(wèn)時(shí),a的地址由下面面的二元組表表示:(npna,a在活動(dòng)記錄中中的偏移)6.3非局部名字的的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度度為np的過(guò)程p調(diào)用嵌套深度度為nx的過(guò)程x(1)np<nx的情況sort1readarray2exchange2quicksort2partition3這時(shí)x肯定就聲明在在p中6.3非局部名字的的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度度為np的過(guò)程p調(diào)用嵌套深度度為nx的過(guò)程x(1)np<nx的情況被調(diào)用過(guò)程的的訪問(wèn)鏈必須須指向調(diào)用過(guò)過(guò)程的活動(dòng)記記錄的訪問(wèn)鏈鏈訪問(wèn)非局部名名字的存儲(chǔ)單單元sortreadarrayexchangequicksortpartitionsa,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,3)i,j訪問(wèn)鏈6.3非非局部名字的的訪問(wèn)6.3非局部名字的的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度度為np的過(guò)程p調(diào)用嵌套深度度為nx的過(guò)程x(2)npnx的情況sort1readarray2exchange2quicksort2partition3這時(shí)p和x的嵌套深度分分別為1,2,…,nx1的外圍過(guò)程肯肯定相同6.3非局部名字的的訪問(wèn)建立訪問(wèn)鏈假定嵌套深度度為np的過(guò)程p調(diào)用嵌套深度度為nx的過(guò)程x(2)npnx的情況追蹤訪問(wèn)鏈npnx+1次,到達(dá)了靜靜態(tài)包圍x和p的且離它們最最近的那個(gè)過(guò)過(guò)程的最新活活動(dòng)記錄所到達(dá)的活動(dòng)動(dòng)記錄就是x的活動(dòng)記錄中中的訪問(wèn)鏈應(yīng)應(yīng)該指向的那那個(gè)活動(dòng)記錄錄訪問(wèn)非局部名名字的存儲(chǔ)單單元sortreadarrayexchangequicksortpartitionsa,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,3)i,j訪問(wèn)鏈6.3非非局部名字的的訪問(wèn)6.3非局部名字的的訪問(wèn)programparam(input,output);(過(guò)程作為參數(shù)數(shù))procedureb(functionh(n:integer):integer);beginwriteln(h(2))end;procedurec;varm:integer;functionf(n:integer):integer;beginf:=m+nend{f};beginm:=0;b(f)end{c};begincend.函數(shù)f作為參數(shù)數(shù)傳遞時(shí)時(shí),怎樣樣在f6.3非局部名名字的訪訪問(wèn)programparam(input,output);(過(guò)程作為為參數(shù)))procedureb(functionh(…beginwriteln(h(2))end;procedurec;varm:integer;functionf(n:integer)…beginf:=m+nend{f};beginm:=0;b(f)end{c};begincend.從b的訪問(wèn)鏈鏈難以建建立f的訪問(wèn)鏈鏈訪問(wèn)鏈訪問(wèn)鏈paramcmb

<f>6.3非局部名名字的訪訪問(wèn)programparam(input,output);(過(guò)程作為為參數(shù)))procedureb(functionh(…beginwriteln(h(2))end;procedurec;varm:integer;functionf(n:integer)…beginf:=m+nend{f};beginm:=0;b(f)end{c};begincend.f作為參數(shù)數(shù)傳遞時(shí)時(shí),它的的起始地地址連同同它的訪訪問(wèn)鏈一一起傳遞遞訪問(wèn)鏈訪問(wèn)鏈paramcmb

<f,>6.3非局部名名字的訪訪問(wèn)programparam(input,output);(過(guò)程作為為參數(shù)))procedureb(functionh(…beginwriteln(h(2))end;procedurec;varm:integer;functionf(n:integer)…beginf:=m+nend{f};beginm:=0;b(f)end{c};begincend.b調(diào)用f時(shí),用傳傳遞過(guò)來(lái)來(lái)的訪問(wèn)問(wèn)鏈來(lái)建建立f的訪問(wèn)鏈鏈訪問(wèn)鏈訪問(wèn)鏈paramcmb

<f,>訪問(wèn)鏈b6.3非局部名名字的訪訪問(wèn)programret(input,output);(過(guò)程作為為返回值值)varf:function(integer):integer;functiona:function(integer):integer;varm:integer;functionaddm(n:integer):integer;beginreturnm+nend;beginm:=0;returnaddmend;procedureb(g:function(integer):integer);beginwriteln(g(2))end;beginf:=a;b(f)end.aretbaddm6.3非局部名名字的訪訪問(wèn)programret(input,output);(過(guò)程作為為返回值值)varf:function(integer):integer;functiona:function(integer):integer;varm:integer;functionaddm(n:integer):integer;beginreturnm+nend;beginm:=0;returnaddmend;procedureb(g:function(integer):integer);beginwriteln(g(2))end;beginf:=a;b(f)end.aretbaddm執(zhí)行addm時(shí),a的活動(dòng)記記錄已不不存在,,取不到到m的值6.3非局部名名字的訪訪問(wèn)C語(yǔ)言的函函數(shù)聲明明不能嵌嵌套,函函數(shù)不論論在什么么情況下下激活,,要訪問(wèn)問(wèn)的數(shù)據(jù)據(jù)分成兩兩種情況況非靜靜態(tài)態(tài)局局部部變變量量((包包括括形形式式參參數(shù)數(shù))),,它它們們分分配外部變量(包括定義在其它源文件之中的外部變量)和靜態(tài)的局部變量,它們都分配在靜態(tài)數(shù)據(jù)區(qū)因此C語(yǔ)言允許函數(shù)(的指針)作為返回值6.3非局局部部名名字6.3.3動(dòng)態(tài)態(tài)作作用用域域被調(diào)調(diào)用用過(guò)過(guò)程程的的非非局局部部名名字字a和它它在在調(diào)調(diào)用基于運(yùn)行時(shí)的調(diào)用關(guān)系而不是基于靜態(tài)作用域來(lái)確定新的綁定僅為被調(diào)用過(guò)程的局部名字建立,這些名字在被調(diào)用過(guò)程的活動(dòng)記錄中占用存儲(chǔ)單元這一點(diǎn)與靜態(tài)作用域沒(méi)有區(qū)別6.3非局局部部名名字字的的訪訪問(wèn)問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;beginr:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow6.3非局局部programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin靜態(tài)態(tài)作作用用域域show;small;writelnend.dynamicshowsmallsmallshowshowshow6.3非局局部部名名字字programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin動(dòng)態(tài)作用域show;small;writelnend.dynamicshowsmallsmallshowshowshow6.3非局部名字的的訪問(wèn)實(shí)現(xiàn)動(dòng)態(tài)作用用域的方法深訪問(wèn)用控制鏈搜索索運(yùn)行棧,尋尋找包含該非非局部名字的的第一個(gè)活動(dòng)動(dòng)記錄淺訪問(wèn)為每個(gè)名字在靜態(tài)分配的存存儲(chǔ)空間中保存它的當(dāng)當(dāng)前值當(dāng)過(guò)程p的新活動(dòng)出現(xiàn)現(xiàn)時(shí),p的局部名字n使用在靜態(tài)數(shù)數(shù)據(jù)區(qū)分配給給n的存儲(chǔ)單元。。n的先前值保存存在p的活動(dòng)記錄中,當(dāng)p的活動(dòng)結(jié)束時(shí)時(shí)再恢復(fù)6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow?r靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方dynamicr?6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow0.25rdynamicr?靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow0.25rdynamicr?show靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow0.25rdynamicr?smallr0.25靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow0.125rdynamicr?smallr0.25靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方6.3非局部名字的的訪問(wèn)programdynamic(input,output);varr:real;procedureshow;beginwrite(r:5:3)end;proceduresmall;varr:real;beginr:=0.125;showend;begin(綠色表示已執(zhí)執(zhí)行部分)r:=0.25;show;small;writeln;show;small;writelnend.dynamicshowsmallsmallshowshowshow0.25rdynamicr?靜態(tài)區(qū)使用值的地方棧區(qū)暫存值的地方6.4參數(shù)數(shù)傳傳遞遞值調(diào)用用實(shí)參的的右值值傳給給被調(diào)調(diào)用過(guò)過(guò)程值調(diào)用用可以以如下下實(shí)現(xiàn)現(xiàn)把形參參當(dāng)作作所在在過(guò)程程的局局部名名看待待,形形參的的存儲(chǔ)儲(chǔ)單元元在該該過(guò)程程的活活動(dòng)記記錄中中調(diào)用過(guò)過(guò)程計(jì)算實(shí)實(shí)參,,并把把其右右值放放入被調(diào)用用過(guò)程程形參的的存儲(chǔ)儲(chǔ)單元元中6.4參數(shù)數(shù)傳傳遞遞引用調(diào)調(diào)用實(shí)參的的左值值傳給給被調(diào)調(diào)用過(guò)過(guò)程引用調(diào)調(diào)用可可以如如下實(shí)實(shí)現(xiàn)::把形參參當(dāng)作作所在在過(guò)程程的局局部名名看待待,形形參的的存儲(chǔ)儲(chǔ)單元元在該該過(guò)程程的活活動(dòng)記記錄中中調(diào)用過(guò)過(guò)程計(jì)算算實(shí)參參,把實(shí)參參的左左值放放入被被調(diào)用用過(guò)程程形參參的存存儲(chǔ)單單元在被調(diào)調(diào)用過(guò)過(guò)程的的目標(biāo)標(biāo)代碼碼中,,任何何對(duì)形形參的的引用用都是是通過(guò)過(guò)傳給給該過(guò)過(guò)程的的指針針來(lái)間間接引引用實(shí)實(shí)參6.4參數(shù)數(shù)傳傳遞遞換名調(diào)調(diào)用從概念念上說(shuō)說(shuō),每每次調(diào)調(diào)用時(shí)時(shí),用用實(shí)參參表達(dá)達(dá)式對(duì)對(duì)形參進(jìn)進(jìn)行正正文替替換,,然后后再執(zhí)執(zhí)行procedureswap(varx,y:integer);vartemp:integer;begintemp:=x;x:=y;y:=tempend6.4參數(shù)數(shù)傳傳遞遞換名調(diào)調(diào)用從概念念上說(shuō)說(shuō),每每次調(diào)調(diào)用時(shí)時(shí),用用實(shí)參參表達(dá)達(dá)式對(duì)對(duì)形參進(jìn)進(jìn)行正正文替替換,,然后后再執(zhí)執(zhí)行procedureswap(varx,y:integer);vartemp:integer;例如::調(diào)用swap(i,a[i])begintemp:=x;x:=y;y:=tempend6.4參數(shù)數(shù)傳傳遞遞換名調(diào)調(diào)用從概念念上說(shuō)說(shuō),每每次調(diào)調(diào)用時(shí)時(shí),用用實(shí)參參表達(dá)達(dá)式對(duì)對(duì)形參進(jìn)進(jìn)行正正文替替換,,然后后再執(zhí)執(zhí)行procedureswap(varx,y:integer);vartemp:integer;例如::調(diào)用swap(i,a[i])begin替換結(jié)結(jié)果::temp:=i;temp:=x;i:=a[i];x:=y;a[i]:=tempy:=tempend6.4參數(shù)數(shù)傳傳遞遞換名調(diào)調(diào)用從概念念上說(shuō)說(shuō),每每次調(diào)調(diào)用時(shí)時(shí),用用實(shí)參參表達(dá)達(dá)式對(duì)對(duì)形參進(jìn)進(jìn)行正正文替替換,,然后后再執(zhí)執(zhí)行procedureswap(varx,y:integer);vartemp:integer;例如::調(diào)用swap(i,a[i])begin替換結(jié)結(jié)果::temp:=i;temp:=x;i:=a[i];x:=y;a[i]:=tempy:=temp交換兩兩個(gè)數(shù)數(shù)據(jù)的的程序序end并非總總是正正確6.5堆管管理理堆式式分分配配堆用用來(lái)來(lái)存存放放生生存存期期不不確確定定的的數(shù)數(shù)據(jù)據(jù)C++和Java允許許程程序序員員用用new創(chuàng)建建對(duì)對(duì)象象,,它它們們的的生生存存期期沒(méi)沒(méi)有有被被約約束束在在創(chuàng)創(chuàng)建建它它們們的的過(guò)過(guò)程程活活動(dòng)動(dòng)的的生生成成期期之之內(nèi)內(nèi)實(shí)現(xiàn)現(xiàn)內(nèi)內(nèi)存存回回收收是是內(nèi)內(nèi)存存管管理理器器的的責(zé)責(zé)任任堆空空間間的的回回收收有有兩兩種種不不同同方方式式程序序顯顯式式釋釋放放空空間間::free(C)或或delete(C++)垃圾圾收收集集器器自自動(dòng)動(dòng)收收集集((Java)。。11.3節(jié)介介紹紹垃垃圾圾收收集集算算法法,,本本課課程程不不做做介介紹紹6.5堆管管理理6.5.1內(nèi)存存管管理理器器內(nèi)存存管管理理器器把把握握的的基基本本信信息息是是堆堆中中空空閑閑空空間間分配配函函數(shù)數(shù)回收收函函數(shù)數(shù)內(nèi)存存管管理理器器應(yīng)應(yīng)具具有有下下列列性性質(zhì)質(zhì)空間間有有效效性性::極極小小化化程程序序需需要要的的堆堆空空間間總總量量程序有效性性:較好地地利用內(nèi)存存子系統(tǒng),,使得程序序能運(yùn)行得得快一些低開銷:分配和回收收操作所花花時(shí)間在整整個(gè)程序執(zhí)執(zhí)行時(shí)間中中的比例盡盡量小6.5堆管理理6.5.2計(jì)算機(jī)內(nèi)存存分層虛擬內(nèi)存(磁盤)物理內(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ī)機(jī)都設(shè)計(jì)成成程序員不不用關(guān)心內(nèi)內(nèi)存子系統(tǒng)統(tǒng)的細(xì)節(jié)就就可以寫出出正確的程程序程序的效率率不僅取決決于被執(zhí)行行的指令數(shù)數(shù),還取決決于執(zhí)行每每條指令需需要多長(zhǎng)時(shí)時(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í)執(zhí)行一小部部分代碼,,并且僅涉涉及一小部部分?jǐn)?shù)據(jù)時(shí)間局部性性程序訪問(wèn)的的內(nèi)存單元元在很短的的時(shí)間內(nèi)可可能再次被被程序訪問(wèn)問(wèn)空間局部性性毗鄰被訪問(wèn)問(wèn)單元的內(nèi)內(nèi)存單元在在很短的時(shí)時(shí)間內(nèi)可能能被訪問(wèn)6.5堆管理理6.5.3程序局部性性即使知道哪哪些指令會(huì)會(huì)被頻繁執(zhí)執(zhí)行,最快快的緩存也也可能沒(méi)有有大到足以以把它們同同時(shí)放在其其中,因此必須須動(dòng)態(tài)調(diào)整整最快緩存存的內(nèi)容把最近使用用的指令保保存在緩存存是一種較較好的最優(yōu)優(yōu)化利用內(nèi)內(nèi)存分層的的策略改變數(shù)據(jù)布布局或計(jì)算算次序也可可以改進(jìn)程程序數(shù)據(jù)訪訪問(wèn)的時(shí)間間和空間局局部性6.5堆管理理例:一個(gè)個(gè)結(jié)構(gòu)體大大數(shù)組分分拆成若干干個(gè)數(shù)組structstudent{intnum[10000];intnum;charname[10000][20];charname[20];…… …… …}structstudentst[10000];若是順序處處理每個(gè)結(jié)結(jié)構(gòu)體的多多個(gè)域,左左邊方式的的數(shù)據(jù)局部部性較好若是先順序序處理每個(gè)個(gè)結(jié)構(gòu)的num域,再處理理每個(gè)結(jié)構(gòu)構(gòu)的name域,…,則右邊方方式的數(shù)據(jù)據(jù)局部性較較好最好是按左左邊方式編編程,由編編譯器決定定是否需要要將數(shù)據(jù)按按右邊方式式布局6.5堆管理理6.5.4手工回收請(qǐng)請(qǐng)求程序員在程程序中顯式式釋放堆塊塊來(lái)達(dá)到回回收堆塊的的目的內(nèi)存泄漏::沒(méi)有釋放放程序已經(jīng)經(jīng)引用不到到的堆塊只要內(nèi)存沒(méi)沒(méi)有用盡,,它就不影影響程序的的正確性自動(dòng)無(wú)用單單元收集通通過(guò)回收所所有無(wú)用單單元來(lái)擺脫脫內(nèi)存泄漏漏懸空引用::引用已經(jīng)經(jīng)被釋放的的堆塊過(guò)分熱心地地釋放數(shù)據(jù)據(jù)對(duì)象而引引起懸空引用容容易導(dǎo)致不不會(huì)被捕獲獲的錯(cuò)誤本章要要點(diǎn)點(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ǔ)言程序及及其在X86/Linux操作系統(tǒng)上上的編譯結(jié)結(jié)果如下。根根據(jù)所生成成的匯編程程序來(lái)解釋釋程序中四四個(gè)變量的存儲(chǔ)分分配、生存存期、作用用域和置初初值方式等等方面的區(qū)別staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data|.align4.align4|.type cc.2,@object.typeaa,@object|.size cc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2| ...bb:|movw$40,-2(%ebp).value20 |...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data| .align4.align4|.type cc.2,@object.typeaa,@object|.size cc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2| ...bb:|movw$40,-2(%ebp).value20 |...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data| .align4.align4|.type cc.2,@object.typeaa,@object|.size cc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2|...bb:|movw$40,-2(%ebp).value20|...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data|.align4.align4|.typecc.2,@object.typeaa,@object|.sizecc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2|...bb:|movw$40,-2(%ebp).value20|...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data|.align4.align4|.typecc.2,@object.typeaa,@object|.sizecc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2|...bb:|movw$40,-2(%ebp).value20|...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題1.data|.align4.align4|.typecc.2,@object.typeaa,@object|.sizecc.2,4.sizeaa,4|cc.2:aa:|.long30.long10|.text.globlbb|.align4.align2|.globlfunc.typebb,@object|func:.sizebb,2|...bb:|movw$40,-2(%ebp).value20|...staticlongaa=10;shortbb=20;func(){staticlongcc=30;shortdd=40;}例題題2func(i)longi;{longj;j=i-1;func(j);}例題題2func(i)func:longi;pushl%ebp老的基基地址址指針針壓棧棧{movl%esp,%ebp修改基地址址指針針longj;subl$4,%esp為j分配空空間j=i-1;movl8(%ebp),%edx取i到寄存器器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參參j的值壓壓棧callfunc函數(shù)調(diào)調(diào)用addl$4,%esp恢復(fù)棧棧頂指指針L1:leave即movebp,esp;popebpret即popeip(下條指令令地址))...參數(shù)i返址控制鏈變量j...ebp

esp

棧低高例題題2func(i)func:longi;pushl%ebp老的基地地址指針針壓棧{movl%esp,%ebp修改基地址指指針longj;subl$4,%esp為j分配空間間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參j的值壓棧棧callfunc函數(shù)調(diào)用用addl$4,%esp恢復(fù)棧頂頂指針L1:leave即movebp,esp;popebpret即popeip(下條指令令地址))......ebp

esp

例題題2func(i)func:longi;pushl%ebp老的基地地址指針針壓棧{movl%esp,%ebp修改基地址指指針longj;subl$4,%esp為j分配空間間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參j的值壓棧棧callfunc函數(shù)調(diào)用用addl$4,%esp恢復(fù)棧頂頂指針L1:leave即movebp,esp;popebpret即popeip(下條指令令地址))......ebp

esp

參數(shù)i例題題2func(i)func:longi;pushl%ebp老的基地地址指針針壓棧{movl%esp,%ebp修改基地址指指針longj;subl$4,%esp為j分配空間間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參j的值壓棧棧callfunc函數(shù)調(diào)用用addl$4,%esp恢復(fù)棧頂頂指針L1:leave即movebp,esp;popebpret即popeip(下條指令地地址)......ebp

esp

參數(shù)i返址例題題2func(i)func:longi;pushl%ebp老的基地址址指針壓棧棧{movl%esp,%ebp修改基地址指針針longj;subl$4,%esp為j分配空間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參j的值壓棧callfunc函數(shù)調(diào)用addl$4,%esp恢復(fù)棧頂指指針L1:leave即movebp,esp;popebpret即popeip(下條指令地地址)......ebp

esp

參數(shù)i返址控制鏈例題題2func(i)func:longi;pushl%ebp老的基地址址指針壓棧棧{movl%esp,%ebp修改基地址指針針longj;subl$4,%esp為j分配空間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–1jmovl-4(%ebp),%eaxpushl%eax把實(shí)參j的值壓棧callfunc函數(shù)調(diào)用addl$4,%esp恢復(fù)棧頂指指針L1:leave即movebp,esp;popebpret即popeip(下條指令地地址)......ebp

esp

參數(shù)i返址控制鏈例題題2func(i)func:longi;pushl%ebp老的基地址址指針壓棧棧{movl%esp,%ebp修改基地址指針針longj;subl$4,%esp為j分配空間j=i-1;movl8(%ebp),%edx取i到寄存器func(j);decl%edxi–1}movl%edx,-4(%ebp)i–

溫馨提示

  • 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)論