




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院1第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間) )o 當源程序的目標代碼被運行時,在內(nèi)存中不當源程序的目標代碼被運行時,在內(nèi)存中不僅有目標代碼,而且還要保存各種信息僅有目標代碼,而且還要保存各種信息n 例如為源程序中出現(xiàn)的一些量(常量、變量及例如為源程序中出現(xiàn)的一些量(常量、變量及某些數(shù)組等)分配運行時的存儲空間。某些數(shù)組等)分配運行時的存儲空間。o 目標代碼要從操作系統(tǒng)得到一塊存儲區(qū),用目標代碼要從操作系統(tǒng)得到一塊存儲區(qū),用于它的運行。于它的運行。第第7 7章章 運行時環(huán)境運行時環(huán)境machun
2、yan西北工業(yè)大學軟件與微電子學院2o 存儲分配是在運行階段進行的,但存儲分配是在運行階段進行的,但編譯程序在編譯程序在編譯階段要為其設計好存儲組織形式,并將這編譯階段要為其設計好存儲組織形式,并將這種組織形式通過生成的目標代碼體現(xiàn)出來。種組織形式通過生成的目標代碼體現(xiàn)出來。( (舉例說明:舉例說明:函數(shù)調(diào)用分析函數(shù)調(diào)用分析. .txttxt) )o 目標代碼運行時,目標代碼運行時,存儲空間的組織存儲空間的組織稱為目標代稱為目標代碼的碼的運行時環(huán)境運行時環(huán)境。第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間)( )(續(xù)續(xù)) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北
3、工業(yè)大學軟件與微電子學院3o 運行時環(huán)境有三個類型:完全靜態(tài)環(huán)境運行時環(huán)境有三個類型:完全靜態(tài)環(huán)境(fully static environment)、基于棧的環(huán)境、基于棧的環(huán)境(stack-based environment),以及完全動態(tài)環(huán)境以及完全動態(tài)環(huán)境(fully dynamic environment)。這這3種類型的混合形式種類型的混合形式也是可能的。也是可能的。第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間)( )(續(xù)續(xù)) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院4 7.1 7.1 程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器
4、組織7.3 7.3 基于棧的運行時環(huán)境基于棧的運行時環(huán)境7.4 7.4 動態(tài)存儲器動態(tài)存儲器7.5 7.5 參數(shù)存儲機制參數(shù)存儲機制7.7.2 2 完全靜態(tài)的運行時環(huán)境完全靜態(tài)的運行時環(huán)境第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院57.17.1程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器組織目標代碼運行時目標代碼運行時, ,操作系統(tǒng)為目標代碼的運行分配操作系統(tǒng)為目標代碼的運行分配的存儲空間按用途可劃分為下面幾個部分的存儲空間按用途可劃分為下面幾個部分: :由于棧區(qū)和堆區(qū)的長由于棧區(qū)和堆區(qū)的長度會
5、隨著目標代碼的度會隨著目標代碼的運行而變化,因此把運行而變化,因此把它們分配在數(shù)據(jù)區(qū)的它們分配在數(shù)據(jù)區(qū)的兩端。一般情況下,兩端。一般情況下,棧向下長,堆向上長,棧向下長,堆向上長,可以使棧和堆共用一可以使棧和堆共用一空白存儲空間。空白存儲空間。第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院67.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))o 代碼區(qū)域:目標代碼的存儲區(qū)域,由于代碼區(qū)在執(zhí)行之代碼區(qū)域:目標代碼的存儲區(qū)域,由于代碼區(qū)在執(zhí)行之前是固定的,在編譯時所有目標代碼的地址都是可計算前是固定的,在編譯時所有目標代碼的地址都是可計算的,程序
6、執(zhí)行結(jié)束后代碼區(qū)域內(nèi)存由系統(tǒng)釋放。的,程序執(zhí)行結(jié)束后代碼區(qū)域內(nèi)存由系統(tǒng)釋放。 o 全程全程/ /靜態(tài)區(qū)域:靜態(tài)數(shù)據(jù)區(qū)用來存放那些具有絕對地靜態(tài)區(qū)域:靜態(tài)數(shù)據(jù)區(qū)用來存放那些具有絕對地址的數(shù)據(jù)和變量址的數(shù)據(jù)和變量( (如靜態(tài)變量和全程變量如靜態(tài)變量和全程變量) );編譯器可以編譯器可以確定其所占用存儲空間的大小,初始化的全局變量和靜確定其所占用存儲空間的大小,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域,程序執(zhí)行結(jié)束后由系統(tǒng)靜態(tài)變量在相鄰的另一塊區(qū)域,程序執(zhí)行結(jié)束后由系統(tǒng)釋放。釋放。o 本章案例分析本
7、章案例分析.doc.doc第第7 7章章 運行時環(huán)境運行時環(huán)境7.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))o 棧區(qū):棧區(qū):函數(shù)中的形參和在函數(shù)中定義的局部變量以及局部臨時變量(C、C+、Java),這些變量分配在棧區(qū),分配在棧區(qū),每次函數(shù)執(zhí)行的時候會在棧中為函數(shù)的執(zhí)行分配相應的存儲區(qū),而在函數(shù)執(zhí)行完畢后,釋放相應的存儲區(qū)。n編譯器編譯器“知道知道”存在棧中的具體數(shù)據(jù)所占內(nèi)存大小和內(nèi)存分配存在棧中的具體數(shù)據(jù)所占內(nèi)存大小和內(nèi)存分配和釋放的和釋放的“時刻時刻”;machunyan西北工業(yè)大學軟件與微電子學院7第第7 7章章 運行時環(huán)境運行時環(huán)境o 堆區(qū):供用戶動態(tài)申請存儲空間
8、,編譯器堆區(qū):供用戶動態(tài)申請存儲空間,編譯器“不需要不需要”知知道究竟得從道究竟得從heapheap中分配多少空間,也不需要知道從中分配多少空間,也不需要知道從heapheap上分配的空間究竟需要存在多久。上分配的空間究竟需要存在多久。n 在c中由malloc,free運算產(chǎn)生釋放的存儲空間,在c+中 由new和delete運算符作用的存儲空間,以及在Java中由new分配的存儲空間都在堆中進行分配。machunyan西北工業(yè)大學軟件與微電子學院87.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學
9、院9第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院10第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院117.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))o 在在 語言中語言中, , 采用以函數(shù)(或過程)為單位的動態(tài)存采用以函數(shù)(或過程)為單位的動態(tài)存儲分配方案:儲分配方案:n當一函數(shù)被調(diào)用時,就在棧頂為該函數(shù)分配所需的數(shù)據(jù)空當一函數(shù)被調(diào)用時,就在棧頂為該函數(shù)分配所需的數(shù)據(jù)空間間( (過程活動記錄過程活動記錄) ),當一個函數(shù)工作完畢返回時,它在棧,當一個函數(shù)工作完畢返回時,它在棧頂?shù)臄?shù)據(jù)空間頂?shù)臄?shù)據(jù)空間
10、( (過程活動記錄過程活動記錄) )也即釋放。也即釋放。第第7 7章章 運行時環(huán)境運行時環(huán)境o 活動記錄存放的信息至少應包括以下幾個部分:活動記錄存放的信息至少應包括以下幾個部分:machunyan西北工業(yè)大學軟件與微電子學院12存放主調(diào)函數(shù)為被調(diào)函數(shù)存放主調(diào)函數(shù)為被調(diào)函數(shù)提供的實參信息提供的實參信息;存放目標程序臨時變存放目標程序臨時變量的值量的值;存放本次執(zhí)行中的局部數(shù)據(jù)存放本次執(zhí)行中的局部數(shù)據(jù)用于指向主調(diào)函數(shù)的用于指向主調(diào)函數(shù)的活動記活動記錄的控制鏈錄的控制鏈和返回地址和返回地址;7.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境ma
11、chunyan西北工業(yè)大學軟件與微電子學院137.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))實參實參返回地址返回地址控制鏈控制鏈臨時變量和局部數(shù)據(jù)臨時變量和局部數(shù)據(jù)實參實參返回地址返回地址控制鏈控制鏈臨時變量和局部數(shù)據(jù)臨時變量和局部數(shù)據(jù)調(diào)用者調(diào)用者的活動的活動記錄記錄被調(diào)用被調(diào)用者的活者的活動記錄動記錄調(diào)調(diào)用用者者的的職職責責第第7 7章章 運行時環(huán)境運行時環(huán)境語言所調(diào)用函數(shù)語言所調(diào)用函數(shù)的活動記錄示例的活動記錄示例( (函數(shù)調(diào)用分析中函數(shù)調(diào)用分析中的舉例的舉例) )o 控制鏈:指向調(diào)用函數(shù)活動記錄的一個地址。machunyan西北工業(yè)大學軟件與微電子學院14b:2a:1
12、該函數(shù)調(diào)用結(jié)束該函數(shù)調(diào)用結(jié)束時的返回地址時的返回地址(00401014)主調(diào)函數(shù)的控主調(diào)函數(shù)的控制鏈制鏈c:3棧底棧底棧頂棧頂7.17.1程序執(zhí)行時的存儲器組織(續(xù))程序執(zhí)行時的存儲器組織(續(xù))當前函數(shù)的當前函數(shù)的控制鏈控制鏈第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院157.1 7.1 程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器組織7.2 7.2 完全靜態(tài)的運行時環(huán)境完全靜態(tài)的運行時環(huán)境7.3 7.3 基于棧的運行時環(huán)境7.4 7.4 動態(tài)存儲器動態(tài)存儲器7.5 7.5 參數(shù)存儲機制參數(shù)存儲機制第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間)
13、)第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院167.2 7.2 完全靜態(tài)的運行時環(huán)境完全靜態(tài)的運行時環(huán)境o 在完全靜態(tài)環(huán)境中,不僅全局變量,所有的變量都是在完全靜態(tài)環(huán)境中,不僅全局變量,所有的變量都是靜態(tài)分配,即整個程序所需數(shù)據(jù)空間的總量在編譯時靜態(tài)分配,即整個程序所需數(shù)據(jù)空間的總量在編譯時是完全確定的,從而每個數(shù)據(jù)名的地址就可靜態(tài)地進是完全確定的,從而每個數(shù)據(jù)名的地址就可靜態(tài)地進行分配,適于靜態(tài)分配的語言,要求滿足的條件是:行分配,適于靜態(tài)分配的語言,要求滿足的條件是:n每個數(shù)據(jù)名所需的存儲空間的大小都是常量每個數(shù)據(jù)名所需的存儲空間的大小都是常量n不允
14、許采用動態(tài)的數(shù)據(jù)結(jié)構(gòu),即在程序運行過程中申請或釋不允許采用動態(tài)的數(shù)據(jù)結(jié)構(gòu),即在程序運行過程中申請或釋放的數(shù)據(jù)結(jié)構(gòu)放的數(shù)據(jù)結(jié)構(gòu)n過程不可遞歸調(diào)用過程不可遞歸調(diào)用第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院17整個程序整個程序存儲器如存儲器如右所示:右所示:7.2 7.2 完全靜態(tài)的運行時環(huán)境(續(xù))完全靜態(tài)的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院187.1 7.1 程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器組織7.2 7.2 完全靜態(tài)的運行時環(huán)境完全靜態(tài)的運行時環(huán)境7.3 7.3 基于棧的運行時環(huán)境基于
15、棧的運行時環(huán)境7.4 7.4 動態(tài)存儲器動態(tài)存儲器7.5 7.5 參數(shù)存儲機制參數(shù)存儲機制第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院197.3 7.3 基于棧的運行時環(huán)境基于棧的運行時環(huán)境o 在一個在一個所有函數(shù)都是全局的所有函數(shù)都是全局的、函數(shù)、函數(shù)定義不允定義不允許嵌套許嵌套,但允許函數(shù)遞歸調(diào)用的程序設計語,但允許函數(shù)遞歸調(diào)用的程序設計語言言( (例如例如C C語言語言) )中,基于棧的動態(tài)運行時環(huán)中,基于棧的動態(tài)運行時環(huán)境有兩個指針境有兩個指針:n sp:棧頂部棧頂部( (top of
16、 stack) )指針;對于指針;對于x86x86系統(tǒng)來系統(tǒng)來說,它采用說,它采用spsp或或espesp寄存器存儲棧頂部的地址;寄存器存儲棧頂部的地址;n 注:用它只可訪問棧頂注:用它只可訪問棧頂?shù)诘? 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院207.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))n fp(frame point):控制鏈指針,即存儲控制鏈指針,即存儲當前活當前活動記錄的控制鏈(即一個地址)動記錄的控制鏈(即一個地址),對于對于x86系系統(tǒng),它采用統(tǒng),它采用bp或或ebp寄存器寄存器存儲存儲當前活動記錄當前活動記錄的控制鏈,其作
17、用如下:的控制鏈,其作用如下:o 1.1.通過該指針可以訪問主調(diào)函數(shù)的活動記錄;即允通過該指針可以訪問主調(diào)函數(shù)的活動記錄;即允許在當前的被調(diào)函數(shù)執(zhí)行完畢時,用它來恢復主調(diào)許在當前的被調(diào)函數(shù)執(zhí)行完畢時,用它來恢復主調(diào)函數(shù)的活動記錄。函數(shù)的活動記錄。o 2.2.通過該指針可以訪問當前執(zhí)行函數(shù)的實參和局部通過該指針可以訪問當前執(zhí)行函數(shù)的實參和局部變量;變量;第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院21b:2a:1該函數(shù)調(diào)用結(jié)束該函數(shù)調(diào)用結(jié)束時的返回地址時的返回地址(cs:eip) 00401014主調(diào)函數(shù)的控主調(diào)函數(shù)的控制鏈制鏈(main.ebp)void
18、_stdcall void _stdcall f_stdcall(int f_stdcall(int a,int b)a,int b) int c;int c;c=a+b;c=a+b; c:3esp棧底棧底棧頂棧頂ebp7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院22當一個函數(shù)被調(diào)用時,當一個函數(shù)被調(diào)用時,在棧頂為該函數(shù)分配在棧頂為該函數(shù)分配所需的數(shù)據(jù)空間所需的數(shù)據(jù)空間( (過程活動記錄過程活動記錄) )如下:如下:將將實參實參的值壓入在該函數(shù)對應的的值壓入在該函數(shù)對應的新活動記錄新活動記錄中
19、。中。將被調(diào)函數(shù)執(zhí)行完畢后的將被調(diào)函數(shù)執(zhí)行完畢后的返回地址返回地址壓入在壓入在新的活動記錄新的活動記錄中。中。完成到被調(diào)用的過程代碼一個轉(zhuǎn)移。完成到被調(diào)用的過程代碼一個轉(zhuǎn)移。將主調(diào)函數(shù)的將主調(diào)函數(shù)的fpfp作為作為控制鏈壓入到新的活動記錄控制鏈壓入到新的活動記錄中。中。改變改變fpfp以使其以使其指向新的活動記錄指向新的活動記錄( (將將spsp復制到復制到fpfp中中) )將該函數(shù)的將該函數(shù)的局部變量局部變量和和局部臨時變量局部臨時變量壓入到新的活動記錄中。壓入到新的活動記錄中。7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machuny
20、an西北工業(yè)大學軟件與微電子學院23b:2a:1該函數(shù)調(diào)用結(jié)束該函數(shù)調(diào)用結(jié)束時的返回地址時的返回地址(cs:eip) 00401014主調(diào)函數(shù)的控主調(diào)函數(shù)的控制鏈制鏈(main.fp)語言當前執(zhí)語言當前執(zhí)行函數(shù)的活動行函數(shù)的活動記錄示例:記錄示例:c:3sp棧底棧底棧頂棧頂fp7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院24當被調(diào)函數(shù)執(zhí)行完畢返回時,其對應當被調(diào)函數(shù)執(zhí)行完畢返回時,其對應的活動記錄從棧中彈出的過程:的活動記錄從棧中彈出的過程: 將將fpfp復制到復制到spsp中。中。 將控制鏈
21、裝載到將控制鏈裝載到fpfp中。中。 完成到返回地址主調(diào)函數(shù)的一個轉(zhuǎn)移。完成到返回地址主調(diào)函數(shù)的一個轉(zhuǎn)移。 改變改變spsp以彈出實參。以彈出實參。7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院25例:計算兩個非負整數(shù)最大公約數(shù)的例:計算兩個非負整數(shù)最大公約數(shù)的c c代碼如下:代碼如下:#include int x,y;int gcd(int u,int v) if(v= =0) return u; else return gcd(v,u%v)main() scanf(“%d%d”,&x
22、,&y); printf(“%dn”,gcd(x,y); return 0;7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院26x:15x:15y:10y:10全局全局/ /靜態(tài)區(qū)域靜態(tài)區(qū)域mainmain的活動記錄的活動記錄sp,fpsp,fpv:10v:10u:15u:15返回地址返回地址mainmain的的fpfp第一次調(diào)用第一次調(diào)用gcdgcd時的活動記錄時的活動記錄sp,fpsp,fp第二次調(diào)用第二次調(diào)用gcdgcd時的活動記錄時的活動記錄v:5v:5u:10u:10返回地址返回
23、地址第一次調(diào)用第一次調(diào)用gcdgcd時的時的fpfp第三次調(diào)用第三次調(diào)用gcdgcd時的活動記錄時的活動記錄v:0v:0u:5u:5返回地址返回地址第二次調(diào)用第二次調(diào)用gcdgcd時的時的fpfpsp,fpsp,fpsp,fpsp,fp棧生長方向棧生長方向自由空間自由空間7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院27例:考慮下列程序清單的例:考慮下列程序清單的c c代碼。代碼。int x=2;void g(int);void f(int n)static int x=1; g(n); x-
24、-;void g(int m)int y=m-1;if (y0) f(y); x- -; g(y); main()g(x); return 0;畫出至第二次對畫出至第二次對g調(diào)用時,調(diào)用時,程序的運行時環(huán)境:程序的運行時環(huán)境:7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院28x:2x:2x x(from ffrom f):1:1全局全局/ /靜態(tài)區(qū)域靜態(tài)區(qū)域mainmain的活動記錄的活動記錄sp,fpsp,fpm:2m:2返回地址返回地址mainmain的的fp fp y:1y:1第一次調(diào)用第
25、一次調(diào)用g g時時的活動記錄的活動記錄fpfpspsp第一次調(diào)用第一次調(diào)用f f時時的活動記錄的活動記錄n:1n:1 返回地址返回地址第一次調(diào)用第一次調(diào)用g g時的時的fpfpsp,fpsp,fp第二次調(diào)用第二次調(diào)用g g時的時的活動記錄活動記錄m:1m:1 返回地址返回地址第一次調(diào)用第一次調(diào)用f f時的時的fp fp y:0y:0fpfpspsp棧生長方向棧生長方向自由空間自由空間7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院29o 目標代碼的生成必須目標代碼的生成必須n 支持變量和臨時變量的
26、實際定位,并增加支持運支持變量和臨時變量的實際定位,并增加支持運行時環(huán)境所必需的代碼行時環(huán)境所必需的代碼。 對名字的訪問對名字的訪問o 局部臨時變量局部臨時變量o 嵌套聲明嵌套聲明o 如何處理可變長度的問題如何處理可變長度的問題7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院30對名字的訪問:對名字的訪問:o 在沒有局部過程的基于棧的運行時環(huán)境中,所有的非在沒有局部過程的基于棧的運行時環(huán)境中,所有的非局部的名字都是全局的局部的名字都是全局的,因此也就是靜態(tài)的,都具有,因此也就是靜態(tài)的,都具有一個固
27、定的靜態(tài)地址,可以被直接訪問。一個固定的靜態(tài)地址,可以被直接訪問。o 對函數(shù)參數(shù)和局部變量而言,在大多數(shù)的語言中,如對函數(shù)參數(shù)和局部變量而言,在大多數(shù)的語言中,如果函數(shù)的聲明在編譯時是固定的,而且為每個聲明分果函數(shù)的聲明在編譯時是固定的,而且為每個聲明分配的存儲器大小也根據(jù)其數(shù)據(jù)類型而固定,配的存儲器大小也根據(jù)其數(shù)據(jù)類型而固定,每個實參每個實參和局部聲明的偏移量可由編譯程序計算和局部聲明的偏移量可由編譯程序計算。第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院31m:2 m:2 返回地址返回地址控制鏈控制鏈 y:1y:1fpfpmOffsetmOffsetyO
28、ffsetyOffsetmOffset=+8mOffset=+8yOffset=-4yOffset=-4高端地址高端地址低端地址低端地址對名字的訪問:(續(xù))對名字的訪問:(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院32例:考慮下面的例:考慮下面的C C過程過程Viod f(int x,char c)Viod f(int x,char c)int a10;int a10; double y; double y; c cx x 返回地址返回地址控制鏈控制鏈a9a9a1a1a0a0y yfpfpcOffsetcOffsetaOffsetaOffsetxOf
29、fsetxOffsetyOffsetyOffsetxOffset=+8xOffset=+8cOffset=+12cOffset=+12aOffset=-40aOffset=-40yOffset=-48yOffset=-48現(xiàn)在對現(xiàn)在對aiai訪問,要求計算地址:訪問,要求計算地址:(-40+4(-40+4* *i)(fp)i)(fp)對名字的訪問:(續(xù))對名字的訪問:(續(xù))對對f調(diào)用的活動記錄為:調(diào)用的活動記錄為:第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院33o 目標代碼的生成必須目標代碼的生成必須n 支持變量和臨時變量的實際定位,并增加支持運支持變量和
30、臨時變量的實際定位,并增加支持運行時環(huán)境所必需的代碼行時環(huán)境所必需的代碼。o 對名字的訪問對名字的訪問 局部臨時變量局部臨時變量o 嵌套聲明嵌套聲明o 如何處理可變長度的問題如何處理可變長度的問題7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院34局部臨時變量:局部臨時變量:o 考慮考慮C表達式:表達式:xi=(i+j)*(i/k+f(j),在這個,在這個表達式從左到右的求值計算中,在對表達式從左到右的求值計算中,在對f的調(diào)的調(diào)用過程中需要保存中間結(jié)果:用過程中需要保存中間結(jié)果: xi的地址、的地
31、址、i+j的和、的和、i/k的商。的商。n 這些中間值可計算到寄存器中,根據(jù)寄存器進這些中間值可計算到寄存器中,根據(jù)寄存器進行保存和恢復;或者行保存和恢復;或者可將它們作為臨時變量存可將它們作為臨時變量存儲在對儲在對f調(diào)用之前的運行時棧中調(diào)用之前的運行時棧中。如下所示:。如下所示:第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院35 返回地址返回地址控制鏈控制鏈xixi的地址的地址i+ji+j的結(jié)果的結(jié)果i/ji/j的結(jié)果的結(jié)果fpfp( (棧的其余部分棧的其余部分) )spsp臨時棧臨時棧調(diào)用調(diào)用f f(將要創(chuàng)建的)時的將要創(chuàng)建的)時的新活動記錄新活動記錄包
32、含表達式過程的活動記錄包含表達式過程的活動記錄自由空間自由空間局部臨時變量:(續(xù))局部臨時變量:(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院36o 目標代碼的生成必須目標代碼的生成必須n 支持變量和臨時變量的實際定位,并增加支持運支持變量和臨時變量的實際定位,并增加支持運行時環(huán)境所必需的代碼行時環(huán)境所必需的代碼。o 對名字的訪問對名字的訪問p 局部臨時變量局部臨時變量p 嵌套聲明嵌套聲明o 如何處理可變長度的問題如何處理可變長度的問題7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan
33、西北工業(yè)大學軟件與微電子學院37嵌套聲明也出現(xiàn)了與局部臨時變量同樣的問題??紤]以下的嵌套聲明也出現(xiàn)了與局部臨時變量同樣的問題??紤]以下的C C代碼:代碼:Void p(int x,double y) char a; int i; A: double x; int j; B: char *a; int k; 嵌套聲明:嵌套聲明:第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院38x:x:y:y: 返回地址返回地址 控制鏈控制鏈a:a:i:i:x x: :j j: :fpfp( (棧的其余部分棧的其余部分) )spsp塊塊A A的分配區(qū)的分配區(qū)調(diào)用調(diào)用p p時的活
34、動記錄時的活動記錄自由空間自由空間嵌套聲明:(續(xù))嵌套聲明:(續(xù))o一個簡單的處理辦法是按照與臨時表達式相類似的辦法在嵌套一個簡單的處理辦法是按照與臨時表達式相類似的辦法在嵌套的塊中處理聲明,并在進入塊時在棧中分配它們。當進入塊的塊中處理聲明,并在進入塊時在棧中分配它們。當進入塊A后,運行時棧如下所示:后,運行時棧如下所示:第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院39x:x:y:y: 返回地址返回地址控制鏈控制鏈a:a:i:i:a a: :k k: :fpfp( (棧的其余部分棧的其余部分) )spsp塊塊B B的分配區(qū)的分配區(qū)調(diào)用調(diào)用p p時的活動記
35、錄時的活動記錄自由空間自由空間當進入塊當進入塊B B后,運行時棧如下所示:后,運行時棧如下所示:嵌套聲明:(續(xù))嵌套聲明:(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院40o 目標代碼的生成必須目標代碼的生成必須n 支持變量和臨時變量的實際定位,并增加支持運支持變量和臨時變量的實際定位,并增加支持運行時環(huán)境所必需的代碼行時環(huán)境所必需的代碼。o 對名字的訪問對名字的訪問p 局部臨時變量局部臨時變量p 嵌套聲明嵌套聲明 如何處理可變長度的問題如何處理可變長度的問題7.3 7.3 基于棧的運行時環(huán)境(續(xù))基于棧的運行時環(huán)境(續(xù))第第7 7章章 運行時環(huán)境運行
36、時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院41處理可變長度的數(shù)據(jù)處理可變長度的數(shù)據(jù)有時編譯程序必須處理數(shù)據(jù)變化的可能性,表現(xiàn)在數(shù)據(jù)對象的數(shù)量和每有時編譯程序必須處理數(shù)據(jù)變化的可能性,表現(xiàn)在數(shù)據(jù)對象的數(shù)量和每個對象的大小上。發(fā)生在支持基于棧的環(huán)境的語言中的一種情況如下:個對象的大小上。發(fā)生在支持基于棧的環(huán)境的語言中的一種情況如下: 調(diào)用中的自變量的數(shù)量可根據(jù)調(diào)用的不同而不同。調(diào)用中的自變量的數(shù)量可根據(jù)調(diào)用的不同而不同。printf(printf(“%d%s, n, prompt);%d%s, n, prompt);printf(printf(“%d %d %d %d %d %d ”,3
37、,4,50);,3,4,50);通常,通常,C C編譯程序一般通過把調(diào)用的自變量按相反順序編譯程序一般通過把調(diào)用的自變量按相反順序( (in reverse in reverse order)order)壓入到運行時棧來處理這一點。壓入到運行時棧來處理這一點。第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院42oprintf(“%d %d %d” ,3,4,50);n設置一指針設置一指針ap;n讓讓ap指向第一個可變參數(shù)指向第一個可變參數(shù)(地址為地址為ebp+控制鏈所占的空控制鏈所占的空間間+返回地址所占的空間返回地址所占的空間+固定參數(shù)所占的空間固定參數(shù)所占
38、的空間),即,即3所所在的空間;在的空間;n返回返回3,ap的值加的值加4即指向即指向4所在的存儲空間所在的存儲空間,通過指通過指針針ap的移動讀取所有的可變參數(shù),根據(jù)固定參數(shù)的移動讀取所有的可變參數(shù),根據(jù)固定參數(shù)“%d %d %d”,該字符串中每出現(xiàn)一個,該字符串中每出現(xiàn)一個“%d”就執(zhí)行一次;就執(zhí)行一次;固定參數(shù)指出了后面的可固定參數(shù)指出了后面的可變參數(shù)的個數(shù);變參數(shù)的個數(shù); 清除變量清除變量ap。處理可變長度的數(shù)據(jù)處理可變長度的數(shù)據(jù)(續(xù)續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院437.1 7.1 程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器組織7.
39、2 7.2 完全靜態(tài)的運行時環(huán)境完全靜態(tài)的運行時環(huán)境7.3 7.3 基于棧的運行時環(huán)境基于棧的運行時環(huán)境7.4 7.4 動態(tài)存儲器動態(tài)存儲器7.5 7.5 參數(shù)存儲機制參數(shù)存儲機制第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院447.4.1對象類型對象類型在大多數(shù)面向?qū)ο蟮恼Z言中,對象都有構(gòu)造函數(shù)和在大多數(shù)面向?qū)ο蟮恼Z言中,對象都有構(gòu)造函數(shù)和析構(gòu)函數(shù),它們分別在創(chuàng)建對象和釋放對象時被調(diào)析構(gòu)函數(shù),它們分別在創(chuàng)建對象和釋放對象時被調(diào)用。假定我們有一對象類用。假定我們有一對象類A A,它有方法它有方法
40、m1,m2m1,m2以及字段以及字段a1a1和和a2a2。那么類那么類A A對象的運行時表示有包含對象的運行時表示有包含字段字段a1a1和和a2a2記錄組成:記錄組成:a1a1a2a2m1_Am1_Am2_Am2_A另外,編譯程序維護著一張類另外,編譯程序維護著一張類A A的編譯時方法表:的編譯時方法表:7.4 7.4 動態(tài)存儲器動態(tài)存儲器第第7 7章章 運行時環(huán)境運行時環(huán)境o 在上述簡單的模塊中,字段選擇可以像記錄字在上述簡單的模塊中,字段選擇可以像記錄字段選擇一樣實現(xiàn),方法選擇由編譯程序內(nèi)的識段選擇一樣實現(xiàn),方法選擇由編譯程序內(nèi)的識別過程來實現(xiàn)。即通過一個指向?qū)ο蟮闹羔槪瑒e過程來實現(xiàn)。即通
41、過一個指向?qū)ο蟮闹羔?,方法可以像函?shù)一樣實現(xiàn)。因此方法方法可以像函數(shù)一樣實現(xiàn)。因此方法m2_Am2_A可以可以翻譯為翻譯為c c語言中的函數(shù)。語言中的函數(shù)。n void m2_A(class_A *this, int i) 方法方法m2_A的程序體,通過的程序體,通過this-x訪問訪問 任一對任一對 象字段象字段x 方法的調(diào)用方法的調(diào)用a .m2(3)a .m2(3)可以翻譯成可以翻譯成m2_A(&a,3)m2_A(&a,3)machunyan西北工業(yè)大學軟件與微電子學院457.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan
42、西北工業(yè)大學軟件與微電子學院46繼承特性繼承特性現(xiàn)在假定類現(xiàn)在假定類B B通過增添方法通過增添方法m3m3和字段和字段b1b1來擴展類來擴展類A,A,那么類那么類B B的運行時表示如下:的運行時表示如下:a1a1a2a2m1_Am1_Am2_Am2_Ab1b1另外類另外類B B的方法編譯時表如下:的方法編譯時表如下:m3_Bm3_B7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院47方法重載方法重載假定上例中類假定上例中類B B重新定義了方法重新定義了方法m2m2,那么那么A A中方法中方法m2m2的定義既是它唯
43、的定義既是它唯一的聲明也是它的第一次定義,而它在類一的聲明也是它的第一次定義,而它在類B B中的定義為重定義。中的定義為重定義。為使名字既可以反映聲明它的類,也可以反映定義它的類。方法的為使名字既可以反映聲明它的類,也可以反映定義它的類。方法的名字可有三部分組成:名字可有三部分組成:方法名、聲明方法的類名、定義方法類名方法名、聲明方法的類名、定義方法類名。各部分之間用下劃線(各部分之間用下劃線()分開。因此在類)分開。因此在類A A中聲明在類中聲明在類B B中定義的中定義的方法方法m2m2其名字記為其名字記為m2_A_Bm2_A_B。方法重載影響方法的編譯時表,現(xiàn)在類方法重載影響方法的編譯時表
44、,現(xiàn)在類A A的方法的編譯時表如下:的方法的編譯時表如下:m1_A_Am1_A_Am2_A_Am2_A_Am1_A_Am1_A_Am2_A_Bm2_A_Bm3_B_Bm3_B_B類類B B的方法的的方法的編譯時表如右:編譯時表如右:7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境o 現(xiàn)在假定現(xiàn)在假定a是類是類A的一個對象,而的一個對象,而b是類是類B的一個對象的一個對象n 方法調(diào)用方法調(diào)用a.m2()將翻譯成對將翻譯成對m2_A_A的調(diào)用,而方的調(diào)用,而方法調(diào)用法調(diào)用b.m2()將翻譯成對將翻譯成對m2_A_B的調(diào)用。的調(diào)用。o 2_A_A在類在類A中聲明和
45、定義。中聲明和定義。m2_A_B在類在類A中生明,在中生明,在類類B中定義。中定義。n m2_A_A翻譯形式為:翻譯形式為:o void m2_A_A(Class_A *this, int i);n m2_A_B的翻譯形式為:的翻譯形式為:o void m2_A_B(Class_B *this, int i);machunyan西北工業(yè)大學軟件與微電子學院487.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院49多態(tài)性多態(tài)性當類當類B B繼承類繼承類A A,并且該語言允許,并且該語言允許“類類B B的指針的指針”類
46、型的指針類型的指針能夠賦給一個能夠賦給一個“類類A A的指針的指針”類型的變量時,那么該語言類型的變量時,那么該語言支持多態(tài)型。例如:支持多態(tài)型。例如: Class B Class B * *b=b=; ; Class A Class A * *a=b;a=b;則第二行被翻譯成:則第二行被翻譯成: class A class A * *a=convert_ptr_to_B_to_ptr_to_A(b);a=convert_ptr_to_B_to_ptr_to_A(b);現(xiàn)在,過程現(xiàn)在,過程convert_ptr_to_B_to_ptr_to_A()convert_ptr_to_B_to_ptr
47、_to_A()為一編譯為一編譯時類型的操作時類型的操作, ,它將指向子類它將指向子類B B的一個對象指針轉(zhuǎn)換為指的一個對象指針轉(zhuǎn)換為指向其父類向其父類A A對象的指針。因為類對象的指針。因為類B B的對象也是從類的對象也是從類A A的字的字段開始,因而指針的值并不需要改變,唯一影響的是改段開始,因而指針的值并不需要改變,唯一影響的是改變了指針的類型:變了指針的類型:7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院50a1a1a2a2b1b1指向指向B B的指針的指針指向指向B B中中A A的指針的指針現(xiàn)在同一指針
48、指向了不同類的對象現(xiàn)在同一指針指向了不同類的對象7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院517.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))o 動態(tài)綁定動態(tài)綁定:類型:類型class Aclass A* *的指針的指針p p可能引用了類可能引用了類B B的一個的一個對象,動態(tài)綁定認為如果實際上為類對象,動態(tài)綁定認為如果實際上為類B B的對象,那就應該的對象,那就應該調(diào)用調(diào)用m2_A_B,m2_A_B,如果實際為如果實際為A A的對象,那么就應該調(diào)用的對象,那么就應該調(diào)用m2_A_A.m2_A_A.對于方法
49、調(diào)用對于方法調(diào)用p-m2(3)p-m2(3)o p p是一指向類是一指向類A A對象指針,可以將對象指針,可以將p-m2(3)p-m2(3)被翻譯成如下被翻譯成如下形式:形式: switch(dynamic_type_of(p) case Dynamic_class_A: m2_A_A(p,3); case Dynamic_class_B: m2_A_B(convert_ptr_to_A_to_ptr_to_B(p),3);o 當當p p為一指向類為一指向類B B對象指針時,可以將對象指針時,可以將p-m2(3)p-m2(3) 翻譯為:翻譯為:m2_A_B(p,3);m2_A_B(p,3);第
50、第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院52對于上述的翻譯方法,每一個對象的類型信息實現(xiàn)為一個對于上述的翻譯方法,每一個對象的類型信息實現(xiàn)為一個指向分派表的指針,如下圖所示指向分派表的指針,如下圖所示( (分派表是存儲方法地址分派表是存儲方法地址的記錄,下圖分派表存儲的是方法的記錄,下圖分派表存儲的是方法m1_A_Am1_A_A, m2_A_B m2_A_B和和 m1_B_Bm1_B_B的地址的地址) )a1a1a2a2b1b1指向指向B B的指針的指針指向指向B B中中A A的指針的指針m1_A_Am1_A_Am2_A_Bm2_A_Bm3_B_Bm3_
51、B_B類類B B對象的表示對象的表示分派表分派表B-objectB-objectB-classB-class7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院537.4.2 堆管理堆管理7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))o 對于允許程序為變量在運行時動態(tài)申請和釋對于允許程序為變量在運行時動態(tài)申請和釋放存儲空間的語言放存儲空間的語言,采用堆式分配是最有效采用堆式分配是最有效的解決方案的解決方案.o 堆式分配的基本思想是堆式分配的基本思想是,為運行的程序劃出為運行的程序劃出適當大的空間適當大的空間(稱為堆
52、稱為堆Heap),每當程序申請空每當程序申請空間時間時,就從堆的空閑區(qū)找出一塊空間分配給就從堆的空閑區(qū)找出一塊空間分配給程序程序,每當釋放時則回收之每當釋放時則回收之.第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院54堆分配的必要性堆分配的必要性7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))o在在C中處理鏈表等結(jié)構(gòu)時中處理鏈表等結(jié)構(gòu)時,常常隨機地插入或刪除一些結(jié)點常常隨機地插入或刪除一些結(jié)點,利用利用指針變量和結(jié)構(gòu)類型指針變量和結(jié)構(gòu)類型,可動態(tài)地生成新結(jié)點可動態(tài)地生成新結(jié)點(使用使用malloc()函數(shù)函數(shù)), 或刪除之或刪除之(使用使用free()函數(shù)函
53、數(shù)).o例如例如 struct node char data; struct node *next;定義了鏈表的結(jié)定義了鏈表的結(jié)點點,下面函數(shù)可在表的尾部添加新結(jié)點下面函數(shù)可在表的尾部添加新結(jié)點:n void Append(struct node *head,char ch) struct node *p=head;n while(*p) p=p-next; p-next=malloc(sizeof(struct node);n p-next-data=ch; p-next-next=NULL;o還可用下面的函數(shù)在表頭刪除一結(jié)點還可用下面的函數(shù)在表頭刪除一結(jié)點:nvoid Delete(str
54、uct node *head) struct node *p=head; n if(*p) head =head-next; free(p); 第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院55堆存儲管理的實現(xiàn)堆存儲管理的實現(xiàn)7.4 7.4 動態(tài)存儲器(續(xù))動態(tài)存儲器(續(xù))o 將存儲空間劃分為若干存儲塊將存儲空間劃分為若干存儲塊;用戶可隨機地申請用戶可隨機地申請或釋放一個或多個塊或釋放一個或多個塊;o 在存儲空間中建立兩個隊列在存儲空間中建立兩個隊列:空閑隊列和忙隊列空閑隊列和忙隊列,空空閑隊列拉成鏈閑隊列拉成鏈,鏈首用鏈首用FREE指針指明指針指明,忙隊列
55、用一忙隊列用一(已占塊已占塊)記錄表記錄各占用塊的首址及大小信息記錄表記錄各占用塊的首址及大小信息(也也可用鏈進行記錄可用鏈進行記錄).o 申請時可按需要找到合適的塊分配之申請時可按需要找到合適的塊分配之(分配策略有分配策略有最佳分配或隨機分配等最佳分配或隨機分配等);o 釋放時將該塊插入到空閑隊列釋放時將該塊插入到空閑隊列(能合并時可合并能合并時可合并),并并從占用記錄表中刪除相應的項從占用記錄表中刪除相應的項.第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院567.1 7.1 程序執(zhí)行時的存儲器組織程序執(zhí)行時的存儲器組織7.2 7.2 完全靜態(tài)的運行時環(huán)境
56、完全靜態(tài)的運行時環(huán)境7.3 7.3 基于棧的運行時環(huán)境基于棧的運行時環(huán)境7.4 7.4 動態(tài)存儲器動態(tài)存儲器7.5 7.5 參數(shù)存儲機制參數(shù)存儲機制第第7 7章章 運行時環(huán)境運行時環(huán)境( (存儲空間存儲空間) )第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院577.5 7.5 參數(shù)傳遞機制參數(shù)傳遞機制void inc2( int x)/* incorrect! */ +x;+x; void inc2( int* x)/* now ok */ +(*x);+(*x); o 值傳遞值傳遞:值傳遞的處理方法是:進入過程時值傳遞的處理方法是:進入過程時,送入形參對應
57、的形式送入形參對應的形式單元的是相應實參的值單元的是相應實參的值;過程體中對形參的任何賦值都按對形式;過程體中對形參的任何賦值都按對形式單元的直接訪問來產(chǎn)生代碼。形參和實參不是同一個存儲單元。單元的直接訪問來產(chǎn)生代碼。形參和實參不是同一個存儲單元。n因此因此,一旦把實參之值送入對應形式單元之后一旦把實參之值送入對應形式單元之后,在執(zhí)行過程體期間在執(zhí)行過程體期間,除了以實參值作為形參的初值進行運算之外除了以實參值作為形參的初值進行運算之外,將將不再與實參發(fā)生任不再與實參發(fā)生任何聯(lián)系。由此可見何聯(lián)系。由此可見, 過過 程執(zhí)行的結(jié)果決不會改變實參之值。程執(zhí)行的結(jié)果決不會改變實參之值。第第7 7章章 運行時環(huán)境運行時環(huán)境machunyan西北工業(yè)大學軟件與微電子學院58void inc2( int &x)/* C+ reference parameter */ +x;+x; 7.5 7.5 參數(shù)傳遞機制(續(xù))參數(shù)傳遞機制(續(xù))o 引用傳遞引用傳遞:將實參的地址寫入相
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房地產(chǎn)項目增資入股投資協(xié)議
- 二零二五年度辦公室文員聘用與企業(yè)文化融合協(xié)議
- 二零二五年度新能源汽車碰撞責任免除合同
- 2025年度現(xiàn)代農(nóng)業(yè)病蟲害防治藥害賠償協(xié)議書
- 二零二五年度勞動局標準合同:養(yǎng)老服務業(yè)員工就業(yè)保障協(xié)議范本
- 2025年度賬戶變更補充服務協(xié)議
- 高性能計算中心設備采購及安裝合同
- 企業(yè)辦公室裝飾設計與施工服務合同
- 教育培訓行業(yè)線上課程開發(fā)與運營計劃書
- 電氣設備安裝工程施工合同新
- 祥康健康快車王晗老師講座收集驗方
- 禮儀與教化 課件-2023-2024學年高中美術(shù)湘美版(2019)美術(shù)鑒賞
- 新生兒早期基本保健課件
- 采礦學課程設計硯北煤礦新井設計全套圖紙
- 第19章-城市設計課件
- 人事管理管理制度
- 大型儲罐計算書
- 2022-2023學年廣東省廣州市荔灣區(qū)統(tǒng)考初三第一次模考數(shù)學試題含解析
- 針對本項目售后服務方案
- 2022年桂林電子科技大學高等學歷繼續(xù)教育學士學位英語考試真
- 新人教版七至九年級英語單詞表 漢譯英(含音標)
評論
0/150
提交評論