freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

06-第6章-運(yùn)行時(shí)存儲(chǔ)空間的組織和管理-編譯原理-中國(guó)科-wenkub.com

2025-01-12 03:14 本頁(yè)面
   

【正文】 pushl %ebp 老的基地址指針壓棧 { movl %esp,%ebp修改 基地址指針 long j。 subl $4,%esp 為 j分配空間 j= i 1。 movl 8(%ebp),%edx 取 i到 寄存器 func(j)。 decl %edx i – 1 } movl %edx,4(%ebp) i – 1 ? j movl 4(%ebp),%eax pushl %eax 把實(shí)參 j的值壓棧 call func 函數(shù)調(diào)用 addl $4,%esp 恢復(fù)棧頂指針 L1: leave 即 mov ebp, esp。 pop ebp ret 即 pop eip(下條指令地址 ) . . . . . . ebp esp 參數(shù) i 例 題 2 func(i) func: long i。 pushl %ebp 老的基地址指針壓棧 { movl %esp,%ebp修改 基地址指針 long j。 subl $4,%esp 為 j分配空間 j= i 1。 movl 8(%ebp),%edx 取 i到 寄存器 func(j)。 func(j)。 short dd = 40。 short dd = 40。 short dd = 40。 short dd = 40。 short dd = 40。 short dd = 40。 short dd = 40。 ? 若是順序處理每個(gè)結(jié)構(gòu)體的多個(gè)域 , 左邊方式的數(shù)據(jù)局部性較好 ? 若是先順序處理每個(gè)結(jié)構(gòu)的 num域 , 再處理每個(gè)結(jié)構(gòu)的 name域 , … , 則右邊方式的數(shù)據(jù)局部性較好 ? 最好是按左邊方式編程 , 由編譯器決定是否需要將數(shù)據(jù)按右邊方式布局 堆 管 理 手工回收請(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ǔ)言程序及其在 X86/Linux操作系統(tǒng)上的編譯結(jié) 果如下 。 int num。 i := a[i]。 a[i] := temp y := temp end 參 數(shù) 傳 遞 換名調(diào)用 從概念上說(shuō) , 每次調(diào)用時(shí) , 用實(shí)參表達(dá)式對(duì) 形參進(jìn)行正文替換 , 然后再執(zhí)行 procedure swap(var x, y: integer)。 例如: 調(diào)用 swap(i, a[i]) begin 替換結(jié)果: temp := i。 例如: 調(diào)用 swap(i, a[i]) begin temp := x。 begin temp := x。 show。 begin (綠色表示已執(zhí)行部分 ) r := 。 procedure small。 writeln end. dynamic show small small show show show r dynamic r ? small r 靜態(tài)區(qū) 使用值的地方 棧區(qū) 暫存值的地方 非局部名字的訪問(wèn) program dynamic(input, output)。 small。 begin r := 。 procedure show。 show。 begin (綠色表示已執(zhí)行部分 ) r := 。 procedure small。 writeln end. dynamic show small small show show show r dynamic r ? show 靜態(tài)區(qū) 使用值的地方 棧區(qū) 暫存值的地方 非局部名字的訪問(wèn) program dynamic(input, output)。 small。 begin r := 。 procedure show。 show。 begin (綠色表示已執(zhí)行部分 ) r := 。 procedure small。 writeln end. dynamic show small small show show show ? r 靜態(tài)區(qū) 使用值的地方 棧區(qū) 暫存值的地方 dynamic r ? 非局部名字的訪問(wèn) program dynamic(input, output)。 small。 begin r := 。 procedure show。 small。 show。 var r: real。 var r: real。 writeln。 show end。 begin write(r: 5: 3) end。 small。 show。 var r: real。 var r: real。 procedure b (g: function (integer): integer)。 function addm (n: integer): integer。 b(f) end. a ret b addm 非局部名字的訪問(wèn) program ret (input, output)。 return addm end。 var m: integer。 b(f) end {c}。 procedure c。 begin m := 0。( 過(guò)程作為參數(shù) ) procedure b(function h(… begin writeln(h(2)) end 。 function f(n: integer)… begin f := m+n end {f}。 begin c end. 函數(shù) f作為參數(shù)傳遞時(shí),怎樣在 f被激活時(shí)建立它的訪問(wèn)鏈 非局部名字的訪問(wèn) program param(input, output)。 function f(n: integer): integer。( 過(guò)程作為參數(shù) ) procedure b(function h(n: integer): integer)。 | int j = 20。 B2 int b = 3。 }/? end of B3 ?/ }/? end of B1 ?/ }/? end of B0 ?/ 聲 明 作 用 域 int a = 0。 int b = 0。 { /? begin of B1 ?/ int b = 1。 8 }a。 1 char c2。 typedef struct _a{ typedef struct _b{ char c1。 16 double f。 4 char c2。 }b。 long i。 char c1。 long i。 double f。 對(duì)齊: char : 1, long : 4, double : 8 局部存儲(chǔ)分配 ? 例 在 SPARC/Solaris工作站上下面兩個(gè)結(jié)構(gòu)體的 size分別是 24和 16, 為什么不一樣 ? typedef struct _a{ typedef struct _b{ char c1。 1 char c2。 8 }a。 0 char c1。 8 long i。 }b。 { /? begin of B2 ?/ int a = 2。 { /? begin of B1 ?/ int b = 1。 B0 ? B2 int b = 0。 B3 a0 b0 b1 a2, b3 重疊分配存儲(chǔ)單元 全局棧式存儲(chǔ)分配 本節(jié)介紹 ? 介紹程序運(yùn)行時(shí)所需的各個(gè)活動(dòng)記錄在存儲(chǔ)空間的分配策略 ? 描述過(guò)程的目標(biāo)代碼怎樣訪問(wèn)綁定到局部名字的存儲(chǔ)單元 ? 介紹三種分配策略 – 靜態(tài)分配策略 – 棧式分配策略 – 堆式分配策略 全局棧式存儲(chǔ)分配 運(yùn)行時(shí)內(nèi)存的劃分 代 碼 靜 態(tài) 數(shù) 據(jù) 堆 棧 全局棧式存儲(chǔ)分配 靜態(tài)分配 ? 名字在程序被編譯時(shí)綁定到存儲(chǔ)單元 , 不需要運(yùn)行時(shí)的任何支持 ? 綁定的生存期是程序的整個(gè)運(yùn)行期間 全局棧式存儲(chǔ)分配 靜態(tài)分配給語(yǔ)言帶來(lái)限制 ? 遞歸過(guò)程不被允許 ? 數(shù)據(jù)對(duì)象的長(zhǎng)度和它在內(nèi)存中位置的限制 ,必須是在編譯時(shí)可以知道的 ? 數(shù)據(jù)結(jié)構(gòu)不能動(dòng)態(tài)建立 全局棧式存儲(chǔ)分配 ? 例 C程序的外部變量 、 靜態(tài)局部變量以及程序中出現(xiàn)的常量都可以靜態(tài)分配 ? 聲明在函數(shù)外面 – 外部變量 靜態(tài)分配 – 靜態(tài)外部變量 靜態(tài)分配 ? 聲明在函數(shù)里面 – 靜態(tài)局部變量 也是靜態(tài)分配 – 自動(dòng)變量 不能靜態(tài)分配 全局棧式存儲(chǔ)分配 活動(dòng)樹(shù)和運(yùn)行棧 活動(dòng)樹(shù) – 用樹(shù)來(lái)描繪控制進(jìn)入和離開(kāi)活動(dòng)的方式 m q(1,9) r p(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) 全局棧式存儲(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)控制流從 a的活動(dòng)進(jìn)入 b的活動(dòng) – 結(jié)點(diǎn) a處于結(jié)點(diǎn) b的左邊 , 當(dāng)且僅當(dāng) a的生存期先于 b的生存期 m q(1,9) r p(1,9) q(1,3) . . . . q(5,9) . . . . 全局棧式存儲(chǔ)分配 ? 當(dāng)前活躍著的過(guò)程活動(dòng)可以保存在一個(gè)棧中 – 例 控制棧的內(nèi)容: m, q (1, 9), q (1, 3), q (2, 3) m q(1,9) r p(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) 全局棧式存儲(chǔ)分配 運(yùn)行棧: 把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息 ( 即活動(dòng)記錄 ) 全局棧式存儲(chǔ)分配 運(yùn)行棧: 把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息 ( 即活動(dòng)記錄 ) m a : array m 全局棧式存儲(chǔ)分配 運(yùn)行棧: 把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息 ( 即活動(dòng)記錄 ) m i: integer r a : array m r 全局棧式存儲(chǔ)分配 運(yùn)行棧: 把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息 ( 即活動(dòng)記錄 ) m k: integer q (1, 9) a : array m q(1,9) r 全局棧式存儲(chǔ)分配 運(yùn)行棧: 把控制棧中的信息拓廣到包括過(guò)程活動(dòng)所需的所有局部信息 ( 即活動(dòng)記錄 ) m k: integer q (1, 9) a : array q (1, 3) k: integer m q(1,9) r p(1,9) q(
點(diǎn)擊復(fù)制文檔內(nèi)容
高考資料相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1