中文名 | 引用計數(shù) | 定????義 | 內(nèi)存管理技術(shù) |
---|---|---|---|
相????關(guān) | 垃圾回收算法 | 類????型 | 最直觀的垃圾收集策略 |
學(xué)????科 | 計算機 | 領(lǐng)????域 | 計算機編程語言 |
為什么要選擇為每一個接口單獨維護一個引用計數(shù)而不是針對整個組件維護引用計數(shù)呢?
主要有兩個原因:一是使程序調(diào)試更為方便;另外一個原因是支持資源的按需獲取。
1程序調(diào)試:
假設(shè)在程序中忘記對某個接口調(diào)用Release(其實很多人會犯這個錯)。這樣組件將永遠不會被刪除掉,因為只是在引用計數(shù)值0時delete才會被調(diào)用 。這時就需要找出接口在何時何處應(yīng)該被釋放掉。當(dāng)然找起來是相當(dāng)困難的。在只對整個組件維護一個接口的情況下,進行這種 查找更為因難了。此時必須檢查使用了此組件所提供的所有接口的代碼。但若組件支持對每個接口分別維護一個引用計數(shù)那么可以把查找的范圍限制在某個特定的接口上。在某些情況下這可以節(jié)省大量時間。
2.資源的按需獲取
在實現(xiàn)某個接口時可能需要大量的內(nèi)存或其他資源。對于此種情況,可以在QueryInterface的實現(xiàn)中,在客戶請求此接口時完成資源的分配。但若只對整個組件維護一個引用計數(shù),組件將無法決定何時可以安全地將此些接口相關(guān)聯(lián)的內(nèi)存釋放。但基對每個接口分別維護一個引用計數(shù),那么決定何時可以將此內(nèi)存釋放將會容易得多。
正確使用引用計數(shù)三條簡單的規(guī)則
1. 在返回之前調(diào)用AddRef。對于那些建好些返回接口指針的函數(shù),在返回之前應(yīng)該相應(yīng)的指針調(diào)用AddRef。這些函數(shù)包括QueryInterface 及CreateInstance。這樣當(dāng)客戶從這種 函數(shù)得到一個接口后。它將無需調(diào)用AddRef.
2.使用完接口之后調(diào)用Release。在使用某個接口之后應(yīng)該調(diào)用些接口的Release函數(shù)。
3.在賦值之后調(diào)用AddRef. 在將一個接口指針賦給另一個接口指針時,應(yīng)調(diào)用AddRef。換句話說,在建立接口的別外一個引用之后應(yīng)增加相應(yīng)組件的引用計數(shù)。
在客戶看來,引用計數(shù)是處于接口級的而不是組件級的。但從實現(xiàn)的角度來看,誰的引用計數(shù)被記錄下來實際上沒有關(guān)系。客戶可以一直接相信組件將記錄每個接口本身維護引用計數(shù)值。但客戶不能假設(shè)整個組件維護單個的引用計數(shù)。
對于客戶而言,每一個接口被分別維護一個引用計數(shù)意味著客戶應(yīng)該對它將要使用的指針調(diào)用AddRef,而不是其他的什么指針。對于使用完了指針客戶應(yīng)該調(diào)用其Release。
選擇為每一個接口單獨維護一個引用計數(shù)而不是針對整個組件維護引用計數(shù)的原因:
使程序調(diào)試更為方便;支持資源的按需獲取;
可以通過增大和減少某個數(shù)的值而實現(xiàn)之。
另外要注意的是AddRef和Release的返回值沒有什么意義,只是在程序調(diào)試中才可能會用得上.客戶不應(yīng)將此從此值當(dāng)成是組件或其接口的精確引用數(shù)。
客戶必須對每一個接口具有一個單獨的引用計數(shù)值那樣來處理各接口。因此,客戶必須對不同的接口分別進行引用計數(shù),即使它們的生命期是嵌套的。
一、輸出參數(shù)規(guī)則
輸出參數(shù)指的是給函數(shù)的調(diào)用者傳回一個值的函數(shù)參數(shù)。從這一點上講,輸出參數(shù)的作用同函數(shù)的返回值是類似的。任何在輸出參數(shù)中或作為返回值返回一個新的接口指針的函數(shù)必須對些接口指針調(diào)用AddRer。
二、輸入?yún)?shù)規(guī)則
對傳入函數(shù)的接口指針,無需調(diào)用AddRef和Release,這是因為函數(shù)的生命期嵌套在調(diào)用者的生命期內(nèi)。
三、輸入-輸出參數(shù)規(guī)則
輸入-輸出參數(shù)同時具有輸入?yún)?shù)及輸出參數(shù)的功能。在函數(shù)休中可以使用輸入-輸出參數(shù)的值,然后可以對這些值進行修改并將其返回給調(diào)用者。
在函數(shù)中,對于用輸入-輸出參數(shù)傳遞進來的接口指針,必須在給它賦另外一個接口指針值之前調(diào)用其Release。在函數(shù)返回之前,還必須對輸出參數(shù)中所保存的接口指針調(diào)用AddRef。
四、局部變量規(guī)則
對于局部自制的接口指針,由于它們只是在函數(shù)的生命其內(nèi)才存在,因此無需調(diào)用AddRef和Release。這條規(guī)則實際是輸入?yún)?shù)規(guī)則的直接結(jié)果。在下面的例子中,pIX2只是在函數(shù)foo的生命期內(nèi)都在,因此可以保證其生命期將嵌套在所傳入的pIX指針的生命期,因此無需對pIX2調(diào)用AddRef和Release。
五、全局變量規(guī)則
對于保存在全局變量中的接口指針,在將其傳遞給另外一個函數(shù)之前,必須調(diào)用其AddRef。由于此變量是全局性的,因此任何函數(shù)都可以通過調(diào)用其Release來終止其生命期。對于保存在成員變量中的接口指針,也應(yīng)按此種方式進行處理。因為類中的任何成員函數(shù)都可以改變此種接口指針的狀態(tài)。
六、不能確定時的規(guī)則
對于任何不定的情形,都應(yīng)調(diào)用AddRef和Release對。
另外,在決定要進行優(yōu)化時,應(yīng)給那些沒有進行引用計數(shù)的指針加上相應(yīng)的注釋,否則其它程序員在修改代碼時,將可能會增大接口指針的生命期,從而合引用計數(shù)的優(yōu)化遭到破壞。
忘記調(diào)用Release造成的錯誤可能比不調(diào)用AddRef造成的錯誤更難檢測。
與跟蹤式垃圾回收相比,引用計數(shù)的主要優(yōu)點是可以盡快地回收不再被使用的對象,同時在回收過程中不會導(dǎo)致長時間的停頓,還可以清晰地標(biāo)明每一個對象的生存周期。
在實時應(yīng)用或內(nèi)存受限的系統(tǒng)中,實時響應(yīng)能力是一項重要指標(biāo),而引用計數(shù)作為最容易實現(xiàn)的垃圾回收技術(shù)之一,很適合于這種情況。引用計數(shù)還可以用于管理其他非內(nèi)存資源,如操作系統(tǒng)對象(經(jīng)常比內(nèi)存資源更稀缺)。跟蹤式垃圾回收技術(shù)用終結(jié)器處理此類目標(biāo),但延遲回收可能引發(fā)其他問題。加權(quán)引用計數(shù)是適用于分布式系統(tǒng)的派生技術(shù)。
在可用內(nèi)存被活躍對象填滿的平臺上,跟蹤式垃圾回收會被頻繁觸發(fā),從而降低性能。而引用計數(shù)即便在內(nèi)存瀕臨耗盡的情況下性能依然有所保障。引用計數(shù)還能為其他運行時優(yōu)化技術(shù)提供參考信息,例如對于許多使用不可變對象的系統(tǒng)來說(如函數(shù)式編程語言),大量復(fù)制對象導(dǎo)致的性能懲罰有時十分嚴(yán)重;在此類系統(tǒng)上一個典型的優(yōu)化措施是:假如一個對象被創(chuàng)建以后僅使用了一次,且在其不再被引用的同時另一個類似的對象被創(chuàng)建出來(如Javascript中的字符串拼接賦值操作),可以將刪除原對象創(chuàng)建新對象的行為變?yōu)樾薷脑瓕ο螅瑥亩岣咝省R糜嫈?shù)可以為這類優(yōu)化提供充分的參考信息。
未經(jīng)優(yōu)化的引用計數(shù)相比跟蹤式垃圾回收有兩個主要缺點,都需要引入附加機制予以修復(fù):
頻繁更新引用計數(shù)會降低運行效率。
原始的引用計數(shù)無法解決循環(huán)引用問題。
另外,如果使用空閑列表分配內(nèi)存,那么引用計數(shù)的空間局域性非常差。僅使用引用計數(shù)無法通過移動對象來提高CPU緩存的性能,所以高性能的內(nèi)存分配器都會同時實現(xiàn)一個跟蹤式垃圾回收器以提高性能。許多引用計數(shù)實現(xiàn)(比如PHP和Objective-C)的性能不佳都是因為沒有實現(xiàn)內(nèi)存拷貝。
最直觀的垃圾收集策略是引用計數(shù)。引用計數(shù)很簡單,但是需要編譯器的重要配合,并且增加了賦值函數(shù) (mutator) 的開銷(這個術(shù)語是針對用戶程序的,是從垃圾收集器的角度來看的)。每一個對象都有一個關(guān)聯(lián)的引用計數(shù) —— 對該對象的活躍引用的數(shù)量。如果對象的引用計數(shù)是零,那么它就是垃圾(用戶程序不可到達它),并可以回收。每次修改指針引用時(比如通過賦值語句),或者當(dāng)引用超出范圍時,編譯器必須生成代碼以更新引用的對象的引用計數(shù)。如果對象的引用計數(shù)變?yōu)榱悖敲催\行時就可以立即收回這個塊(并且減少被回收的塊所引用的所有塊的引用計數(shù)),或者將它放到遲延收集隊列中。
com組件將維護一個稱作是引用計數(shù)的數(shù)值。當(dāng)客戶從組件取得一個接口時,此引用計數(shù)值將增1。當(dāng)客戶使用完某個接口后,組件的引用計數(shù)值將減1.當(dāng)引用計數(shù)值為0時,組件即可將自己從內(nèi)存中刪除。
先稱一個產(chǎn)品的個數(shù)重量,然后再輸入取樣產(chǎn)品的重量,再放上其他的產(chǎn)品,再按點數(shù)功能鍵。就可稱出其他產(chǎn)品的個數(shù)
怎么用計數(shù)器(如74l161)設(shè)計一個分頻電路
這個很簡單,只要接成計數(shù)器,然后有四個輸出,第一個輸出的是2分頻,第二個輸出時四分頻往后推,然后再接以個數(shù)據(jù)選擇器,選擇你要的分頻數(shù)
提議點分解試試看
格式:pdf
大小:1.3MB
頁數(shù): 4頁
評分: 4.5
介紹玻璃纖維濾紙的發(fā)展情況和歐洲標(biāo)準(zhǔn)EN1822所推薦的高效濾紙過濾性能測試系統(tǒng),通過理論推導(dǎo)與實驗對比,分析此測試系統(tǒng)中光學(xué)粒子計數(shù)器的重疊損失和系統(tǒng)中測試氣溶膠濃度波動引起的測量誤差。結(jié)果表明,當(dāng)高效濾紙效率測試系統(tǒng)選用2臺計數(shù)器時,測試結(jié)果受氣溶膠濃度波動影響很小,僅取決于計數(shù)器自身的重疊誤差;當(dāng)選用1臺計數(shù)器分別上、下游采樣時,存在著由于氣溶膠粒子濃度波動所造成的測試誤差,可通過減少氣溶膠發(fā)塵器發(fā)塵濃度的波動來有效地減小這種誤差。
格式:pdf
大小:1.3MB
頁數(shù): 30頁
評分: 4.4
【引用】引用 施工圖 設(shè)計說明統(tǒng)一寫作規(guī)定 引用 淺雨如蘭的施工圖設(shè)計說明統(tǒng)一寫作規(guī)定 引用消防工程人的施工圖設(shè)計說明統(tǒng)一寫作規(guī)定 前言 本《電氣、電訊施工圖設(shè)計說明統(tǒng)一寫作規(guī)定》指在規(guī)范本院 電氣、電訊施工圖設(shè)計說明的基本內(nèi)容及深度,需要全體電氣、電 訊設(shè)計人員遵照執(zhí)行。 在編寫時應(yīng)特別注意: 1.必須結(jié)合具體工程所在國家、城市的法律、法規(guī)、規(guī)程和工 程的大小,突出重點,對說明的內(nèi)容予以增加; 2.當(dāng)采用新技術(shù),新材料時,應(yīng)予以補充說明; 3.在具體工程中沒有的內(nèi)容,應(yīng)該刪除相關(guān)條目,不能照搬照 抄。 電氣施工圖設(shè)計說明 一、建筑概況 本工程位于 () , () 路與 () 路交叉口 () 。建筑面積 (m2)。地下 () 層,主要為 車庫、各種機房、庫房,地上 () 層,主要為辦公室、餐廳、 會議室等,屬于 () 類建筑。建筑主體高度 (M),裙 房高度 (M)。結(jié)構(gòu)形式為 () ,基
μC/TCP-IP在運行過程中維護著一組計數(shù)器,用于追蹤網(wǎng)絡(luò)協(xié)議棧的各種錯誤態(tài)。如果需要的話,應(yīng)用程序可以通過檢查錯誤計數(shù)器來調(diào)試運行當(dāng)中的問題,包括內(nèi)存剩余空間較低、性能差或數(shù)據(jù)包丟失等等。
網(wǎng)絡(luò)協(xié)議的錯誤計數(shù)器被放在一個命名為Net_ ErrCtrs的結(jié)構(gòu)體變量中,可以利用調(diào)試器或應(yīng)用程序(以外部變量的形式引用)在運行時檢測該變量。
要使能這些錯誤統(tǒng)計,必須將net_cfg.h中的 NET_CTR_CFG_ERR_EN配置為DEF_ENABLED。
具有記憶輸入脈沖個數(shù)作用的邏輯部件,稱之為計數(shù)器。計數(shù)器的種類很多,按進位制可分為二進制、十進制、五進制、七進制等計數(shù)器;按計數(shù)器中觸發(fā)器翻轉(zhuǎn)的次序可分為異步式和同步式兩種;按計數(shù)過程中數(shù)字的增、減可分為加法、減法、加減可逆計數(shù)器等。
在數(shù)字系統(tǒng)中,對脈沖的個數(shù)進行計數(shù)、以實現(xiàn)數(shù)字測量、運算和控制的數(shù)字部件,稱為計數(shù)器。
計數(shù)器主要由觸發(fā)器構(gòu)成。若按觸發(fā)器的翻轉(zhuǎn)的次序來分類,可以把計數(shù)器分為同步式和異步式。在同步計數(shù)器中,當(dāng)計數(shù)脈沖輸入時所有觸發(fā)器是同時翻轉(zhuǎn)的;而在異步計數(shù)器中,各級觸發(fā)器則不是同時翻轉(zhuǎn)的。若按計數(shù)過程中計數(shù)器中數(shù)字的增減來分類,可以分為加法計數(shù)器,減法計數(shù)器和可逆計數(shù)器(亦稱加減計數(shù)器)。加法計數(shù)器是隨著計數(shù)脈沖的不斷輸入而遞增計數(shù)的;減法計數(shù)器是隨著計數(shù)脈沖的不斷輸入而遞減計數(shù)的;可增可減的稱可逆計數(shù)器 。
計數(shù)器是一種邏輯元件,在一事件發(fā)出時,可使所存儲數(shù)據(jù)增加“1”或一個常數(shù)。從某種意義上說,計數(shù)器也是一個寄存器,它能“記住”送到其輸入端的脈沖數(shù)目。計數(shù)器對計算機來說是很重要的,例如在控制器中要對程序中的指令地址進行計數(shù),以便在執(zhí)行完一條指令后,按新的地址轉(zhuǎn)入下一條指令。計數(shù)器由一定數(shù)量的觸發(fā)器和門電路組成,現(xiàn)在一般都采用集成電路 。
1、如果按照計數(shù)器中的觸發(fā)器是否同時翻轉(zhuǎn)分類,可將計數(shù)器分為同步計數(shù)器和異步計數(shù)器兩種。
2、如果按照計數(shù)過程中數(shù)字增減分類,又可將計數(shù)器分為加法計數(shù)器、減法計數(shù)器和可逆計數(shù)器,隨時鐘信號不斷增加的為加法計數(shù)器,不斷減少的為減法計數(shù)器,可增可減的叫做可逆計數(shù)器。