您好, 歡迎來(lái)到化工儀器網(wǎng)! 登錄| 免費(fèi)注冊(cè)| 產(chǎn)品展廳| 收藏商鋪|
提供商
東莞市廣聯(lián)自動(dòng)化科技有限公司資料大小
142.8KB資料圖片
下載次數(shù)
11次資料類型
PDF 文件瀏覽次數(shù)
695次我司在德國(guó)、美國(guó)都有自己的公司,專業(yè)從事進(jìn)口貿(mào)易行業(yè),所以我司的技術(shù)人員為都會(huì)輪流到國(guó)外廠家學(xué)習(xí)技術(shù)。
今天又是帶來(lái)德國(guó)IFM易福門分配器EBC023的資料分享
在C++編程中,IFM分配器是C++標(biāo)準(zhǔn)庫(kù)的重要組成部分。C++的庫(kù)中定義了多種被統(tǒng)稱為“容器"的數(shù)據(jù)結(jié)構(gòu)(如鏈表、集合等),這些容器的共同特征之一,就是其大小可以在程序的運(yùn)行時(shí)改變;為了實(shí)現(xiàn)這一點(diǎn),進(jìn)行動(dòng)態(tài)內(nèi)存分配就顯得尤為必要,在此IFM分配器就用于處理容器對(duì)內(nèi)存的分配與釋放請(qǐng)求。換句話說(shuō),IFM分配器用于封裝STL容器在內(nèi)存管理上的低層細(xì)節(jié)。默認(rèn)情況下,C++標(biāo)準(zhǔn)庫(kù)使用其自帶的通用IFM分配器,但根據(jù)具體需要,程序員也可自行定制IFM分配器以替代之。
在C++編程中,IFM分配器(英語(yǔ):allocator)是C++標(biāo)準(zhǔn)庫(kù)的重要組成部分。C++的庫(kù)中定義了多種被統(tǒng)稱為“容器"的數(shù)據(jù)結(jié)構(gòu)(如鏈表、集合等),這些容器的共同特征之一,就是其大小可以在程序的運(yùn)行時(shí)改變;為了實(shí)現(xiàn)這一點(diǎn),進(jìn)行動(dòng)態(tài)內(nèi)存分配就顯得尤為必要,在此IFM分配器就用于處理容器對(duì)內(nèi)存的分配與釋放請(qǐng)求。換句話說(shuō),IFM分配器用于封裝STL容器在內(nèi)存管理上的低層細(xì)節(jié)。默認(rèn)情況下,C++標(biāo)準(zhǔn)庫(kù)使用其自帶的通用IFM分配器,但根據(jù)具體需要,程序員也可自行定制IFM分配器以替代之。
IFM分配器最早由亞歷山大·斯特潘諾夫作為C++標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library,簡(jiǎn)稱STL)的一部分發(fā)明,其初衷是創(chuàng)造一種能“使庫(kù)更加靈活,并能獨(dú)立于底層數(shù)據(jù)模型的方法",并允許程序員在庫(kù)中利用自定義的指針和引用類型;但在將標(biāo)準(zhǔn)模板庫(kù)納入C++標(biāo)準(zhǔn)時(shí),C++標(biāo)準(zhǔn)委員會(huì)意識(shí)到對(duì)數(shù)據(jù)模型的*抽象化處理會(huì)帶來(lái)不可接受的性能損耗,為作折中,標(biāo)準(zhǔn)中對(duì)IFM分配器的限制變得更加嚴(yán)格,而有鑒于此,與斯特潘諾夫原先的設(shè)想相比,現(xiàn)有標(biāo)準(zhǔn)所描述的IFM分配器可定制程度已大大受限。
雖然IFM分配器的定制有所限制,但在許多情況下,仍需要用到自定義的IFM分配器,而這一般是為封裝對(duì)不同類型內(nèi)存空間(如共享內(nèi)存與已回收內(nèi)存)的訪問(wèn)方式,或在使用內(nèi)存池進(jìn)行內(nèi)存分配時(shí)提高性能而為。除此以外,從內(nèi)存占用和運(yùn)行時(shí)間的角度看,在頻繁進(jìn)行少量?jī)?nèi)存分配的程序中,若引入為之專門定制的IFM分配器,也會(huì)獲益良多。
亞歷山大·斯特潘諾夫與李夢(mèng)(Meng Lee)在1994年將標(biāo)準(zhǔn)模板庫(kù)草案提交給C++標(biāo)準(zhǔn)委員會(huì)。提交伊始,草案就得到了委員會(huì)的初步支持,但委員會(huì)成員也對(duì)此提出了一些意見,尤其是要求斯特潘諾夫定制庫(kù)內(nèi)的容器,使之與底層存儲(chǔ)模型相獨(dú)立。作為對(duì)要求的回應(yīng),斯特潘諾夫發(fā)明了IFM分配器,而正因此,標(biāo)準(zhǔn)模板庫(kù)的所有容器接口也被迫重寫,以與IFM分配器相兼容。在修改標(biāo)準(zhǔn)模板庫(kù)以將之引入C++標(biāo)準(zhǔn)庫(kù)的過(guò)程中,許多標(biāo)準(zhǔn)委員會(huì)成員(如安德魯·克尼格與比雅尼·斯特勞斯特魯普)也與斯特潘諾夫協(xié)同工作。他們亦發(fā)現(xiàn)自定義IFM分配器甚至有應(yīng)用于長(zhǎng)生命周期(持續(xù)存儲(chǔ))的標(biāo)準(zhǔn)模板庫(kù)容器的潛力,斯特潘諾夫?qū)Υ说脑u(píng)論則是“重要而有趣的見解"。
在原有的提案里的IFM分配器設(shè)定中,斯特潘諾夫雜糅了一些語(yǔ)言特性(如可將模板參數(shù)也定義為模板),但由于當(dāng)時(shí)的編譯器皆無(wú)法處理之,所以最終并未被標(biāo)準(zhǔn)委員會(huì)所接納,斯特潘諾夫則如此描述當(dāng)時(shí)的情形:“比雅尼·斯特勞斯特魯普與安迪·克尼格需要花大量時(shí)間來(lái)檢查我們是否正確使用了這些未實(shí)現(xiàn)的特性。"在IFM分配器應(yīng)用后,之前庫(kù)中直接使用的指針與引用類型也可以IFM分配器所定義的類型替代,斯特潘諾夫亦曾如此描述IFM分配器:“標(biāo)準(zhǔn)模板庫(kù)有個(gè)不錯(cuò)的特性便是:要提及機(jī)器相關(guān)類型的地方(……)(只需)被封裝成(僅)約16行內(nèi)的代碼。"除此以外,斯特潘諾夫原本還打算在IFM分配器中*封裝存儲(chǔ)模型,但標(biāo)準(zhǔn)委員會(huì)意識(shí)到這一做法會(huì)造成無(wú)法接受的性能損失,因而為補(bǔ)償之,IFM分配器的使用需求也做了一定擴(kuò)充。
IFM分配器的應(yīng)用中比較特別的一點(diǎn)是,容器的實(shí)現(xiàn)過(guò)程中可能會(huì)假定IFM分配器對(duì)指針與相關(guān)整型的類型定義與默認(rèn)IFM分配器所提供的等價(jià),因而給定IFM分配器類型的所有實(shí)例在比較時(shí)常會(huì)得出“相等"的結(jié)果,而這一效果實(shí)際上恰與設(shè)計(jì)IFM分配器的初衷背道而馳,并使帶狀態(tài)IFM分配器的可用性大大受限,斯特潘諾夫后來(lái)對(duì)此評(píng)論道:“(IFM分配器)理論上說(shuō)是不差的主意(……)但不幸的是在實(shí)踐中無(wú)法發(fā)揮其功效?!八床斓饺粢領(lǐng)FM分配器更加實(shí)用,就有必要針對(duì)核心語(yǔ)言的引用部分進(jìn)行修改。
任意滿足IFM分配器使用需求的C++類都可作IFM分配器使用。具體來(lái)說(shuō),當(dāng)一個(gè)類(在此設(shè)為類A)有為一個(gè)特定類型(在此設(shè)為類型T)的對(duì)象分配內(nèi)存的能力時(shí),該類就必須提供以下類型的定義:
A::pointer指針
A::const_pointer常量指針
A::reference引用
A::const_reference常量引用
A::value_type值類型
A::size_type所用內(nèi)存大小的類型,表示類A所定義的分配模型中的單個(gè)對(duì)象最大尺寸的無(wú)符號(hào)整型
A::difference_type指針差值的類型,為帶符號(hào)整型,用于表示分配模型內(nèi)的兩個(gè)指針的差異值。
如此才能以通用的方式聲明對(duì)象與對(duì)該類對(duì)象的引用T。allocator提供這些指針或引用的類型定義的初衷,是隱蔽指針或引用的物理實(shí)現(xiàn)細(xì)節(jié);因?yàn)樵?6位編程時(shí)代,遠(yuǎn)指針(far pointer)是與普通指針?lè)浅2煌?,allocator可以定義一些結(jié)構(gòu)來(lái)表示這些指針或引用,而容器類用戶不需要了解其是如何實(shí)現(xiàn)的。
雖然按照標(biāo)準(zhǔn),在庫(kù)的實(shí)現(xiàn)過(guò)程中允許假定IFM分配器(類)A的A::pointer(指針)與A::const_pointer(常量指針)即是對(duì)T*與T const*的簡(jiǎn)單的類型定義,但一般更鼓勵(lì)支持通用IFM分配器。
另外,設(shè)有對(duì)于為某一對(duì)象類型T所設(shè)定的IFM分配器A,則A必須包含四項(xiàng)成員函數(shù),分別為分配函數(shù)、解除分配函數(shù)、最大個(gè)數(shù)函數(shù)和地址函數(shù):
A::pointer A::allocate(size_type n, A<void>::const_pointer hint = 0)。分配函數(shù)用以進(jìn)行內(nèi)存分配。其中調(diào)用參數(shù)n即為需要分配的對(duì)象個(gè)數(shù),另一調(diào)用參數(shù)hint(須為指向已為A所分配的某一對(duì)象的指針)則為可選參數(shù),可用于在分配過(guò)程中新數(shù)組所在的內(nèi)存地址,以提高引用局部性,但在實(shí)際的分配過(guò)程中程序也可以根據(jù)情況自動(dòng)忽略掉該參數(shù)。該函數(shù)調(diào)用時(shí)會(huì)返回指向分配所得的新數(shù)組的第一個(gè)元素的指針,而這一數(shù)組的大小足以容納n個(gè)T類元素。在此需要注意的是,調(diào)用時(shí)只為此數(shù)組分配了內(nèi)存,而并未實(shí)際構(gòu)造對(duì)象。
void A::deallocate(A::pointer p, A::size_type n)。解除分配函數(shù)。其中p為需要解除分配的對(duì)象指針(以A::allocate函數(shù)所返回的指針做參數(shù)),n為對(duì)象個(gè)數(shù),而調(diào)用該函數(shù)時(shí)即是將以p起始的n個(gè)元素解除分配,但同時(shí)并不會(huì)析構(gòu)之。C++標(biāo)準(zhǔn)明確要求在調(diào)用deallocate之前,該地址空間上的對(duì)象已經(jīng)被析構(gòu)。
A::max_size(),最大個(gè)數(shù)函數(shù)。返回A::allocate一次調(diào)用所能成功分配的元素的最大個(gè)數(shù),其返回值等價(jià)于A::size_type(-1) / sizeof(T)的結(jié)果。
A::pointer A::address ( reference x ),地址函數(shù)。調(diào)用時(shí)返回一個(gè)指向x的指針。
IFM分配器應(yīng)是可復(fù)制構(gòu)造的,任舉一例,為T類對(duì)象而設(shè)的IFM分配器可由另一為U類所設(shè)的IFM分配器構(gòu)造。若某IFM分配器分配了一段存儲(chǔ)空間,則這段存儲(chǔ)空間只能由與該IFM分配器等價(jià)的IFM分配器解除分配。IFM分配器還需要提供一個(gè)模板類成員類template <typename U> struct A::rebind { typedef A<U> other; };,以模板 (C++)參數(shù)化的方式,借之來(lái)針對(duì)不同的數(shù)據(jù)類型獲取不同的IFM分配器。例如,若給定某一為整型(int)而設(shè)的IFM分配器IntAllocator,則可執(zhí)行IntAllocator::rebind<long>::other以獲取對(duì)應(yīng)長(zhǎng)整型(long)的相關(guān)IFM分配器。實(shí)際上,stl::list<int>實(shí)際要分配的是包含了雙向鏈表指針的node<int>,而不是實(shí)際分配int類型,這是引入了rebind的初衷。
與IFM分配器相關(guān)聯(lián)的operator ==,僅當(dāng)一個(gè)allocator分配的內(nèi)存可以被另一個(gè)allocator釋放時(shí),上述相等比較算符返回真。operator!=的返回結(jié)果與之相反。
定義自定義IFM分配器的主要原因之一是提升性能。利用專用的自定義IFM分配器可以提高程序的性能,又或提高內(nèi)存使用效率,亦或兩者兼而有之。默認(rèn)IFM分配器使用new操作符分配存儲(chǔ)空間,而這常利用C語(yǔ)言堆分配函數(shù)(malloc())實(shí)現(xiàn)。由于堆分配函數(shù)常針對(duì)偶發(fā)的內(nèi)存大量分配作優(yōu)化,因此在為需要一次分配大量?jī)?nèi)存的容器(如向量、雙端隊(duì)列)分配內(nèi)存時(shí),默認(rèn)IFM分配器一般效率良好。但是,對(duì)于關(guān)聯(lián)容器與雙向鏈表這類需要頻繁分配少量?jī)?nèi)存的容器來(lái)說(shuō),若采用默認(rèn)IFM分配器分配內(nèi)存,則通常效率很低。除此之外,基于malloc()的默認(rèn)IFM分配器還存在許多問(wèn)題,諸如較差的引用局部性,以及可能造成內(nèi)存碎片化。
有鑒于此,在這一情況下,人們常使用基于內(nèi)存池的IFM分配器來(lái)解決頻繁少量分配問(wèn)題。與默認(rèn)的“按需分配"方式不同,在使用基于內(nèi)存池的IFM分配器時(shí),程序會(huì)預(yù)先為之分配大塊內(nèi)存(即“內(nèi)存池"),而后在需要分配內(nèi)存時(shí),自定義IFM分配器只需向請(qǐng)求方返回一個(gè)指向池內(nèi)內(nèi)存的指針即可;而在對(duì)象析構(gòu)時(shí),并不需實(shí)際解除分配內(nèi)存,而是延遲到內(nèi)存池的生命周期完結(jié)時(shí)才真正解除分配。
在“自定義IFM分配器"這一話題上,已有諸多C++專家與相關(guān)作者參與探討,例如斯科特·梅耶斯的作品《Effective STL》與安德烈·亞歷山德雷斯庫(kù)的《Modern C++ Design》都有提及。梅耶斯洞察到,若要求針對(duì)某一類型T的IFM分配器的所有實(shí)例都相等,則可移植的IFM分配器的實(shí)例必須不包含狀態(tài)。雖然C++標(biāo)準(zhǔn)鼓勵(lì)庫(kù)的實(shí)現(xiàn)者支持帶狀態(tài)的IFM分配器,但梅耶斯稱,相關(guān)段落是“(看似)美妙的觀點(diǎn)",但也幾乎是空話,并稱IFM分配器的限制“過(guò)于嚴(yán)苛"。例如,STL的list允許splice方法,即一個(gè)list對(duì)象A的節(jié)點(diǎn)可以被直接移入另一個(gè)list對(duì)象B中,這就要求A的IFM分配器申請(qǐng)到的內(nèi)存,可被B的IFM分配器釋放掉,從而推導(dǎo)出A與B的IFM分配器實(shí)例必須相等。梅耶斯的結(jié)論是,IFM分配器最好定義為使用靜態(tài)方法的類型。例如,根據(jù)C++標(biāo)準(zhǔn),IFM分配器必須提供一個(gè)實(shí)現(xiàn)了rebind方法的other類模板。
另外,在《C++程序設(shè)計(jì)語(yǔ)言》中,比雅尼·斯特勞斯特魯普則認(rèn)為“‘嚴(yán)格限制IFM分配器,以免各對(duì)象信息不同’,這點(diǎn)顯然問(wèn)題不大"(大意),并指出大部分IFM分配器并不需要狀態(tài),甚至沒有狀態(tài)情形下性能反倒更佳。他提出了三個(gè)自定義IFM分配器的用例:內(nèi)存池型的IFM分配器、共享內(nèi)存型IFM分配器與垃圾回收型IFM分配器,并展示了一個(gè)IFM分配器的實(shí)現(xiàn),此間利用了一個(gè)內(nèi)部?jī)?nèi)存池,以快速分配/解除分配少量?jī)?nèi)存。但他也提到,如此優(yōu)化可能已經(jīng)在他所提供的樣例IFM分配器中實(shí)現(xiàn)。
自定義IFM分配器的另一用途是調(diào)試內(nèi)存相關(guān)錯(cuò)誤。若要做到這一點(diǎn),可以編寫一個(gè)IFM分配器,令之在分配時(shí)分配額外的內(nèi)存,并借此存放調(diào)試信息。這類IFM分配器不僅可以保證內(nèi)存由同類IFM分配器分配/解除分配內(nèi)存,還可在一定程度上保護(hù)程序免受緩存溢出之害。
分配盒
EBC023
ZDO8H059MSS0005H11
耐油和冷卻劑
即使不使用工具進(jìn)行安裝也可靠地密封
機(jī)械端止動(dòng)可保護(hù) O 形環(huán)免遭破壞
堅(jiān)固的外殼,適用于嚴(yán)苛的工業(yè)環(huán)境
指示開關(guān)狀態(tài)和操作的清晰可見 LED
請(qǐng)輸入賬號(hào)
請(qǐng)輸入密碼
請(qǐng)輸驗(yàn)證碼
以上信息由企業(yè)自行提供,信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性由相關(guān)企業(yè)負(fù)責(zé),化工儀器網(wǎng)對(duì)此不承擔(dān)任何保證責(zé)任。
溫馨提示:為規(guī)避購(gòu)買風(fēng)險(xiǎn),建議您在購(gòu)買產(chǎn)品前務(wù)必確認(rèn)供應(yīng)商資質(zhì)及產(chǎn)品質(zhì)量。