日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > 充電吧
[導(dǎo)讀]智能指針使用上的問題智能指針的使用太普遍了,它讓程序員擺脫了內(nèi)存管理的惡夢,但實際上智能指針本身也可能引入另一個惡夢。主要包括兩個問題點:性能問題。因為需要引入一些變量(bookkeeping),甚至

智能指針使用上的問題

智能指針的使用太普遍了,它讓程序員擺脫了內(nèi)存管理的惡夢,但實際上智能指針本身也可能引入另一個惡夢。主要包括兩個問題點:

性能問題。因為需要引入一些變量(bookkeeping),甚至在多線程下的一些互斥操作,它所帶來的性能開銷往往比想像的要高。比如以智能指針作為函數(shù)參數(shù)以及返回值時。對象釋放的時機不明確。比如std::auto_ptr,總讓人感覺不明不白。而有時一些循環(huán)引用,又會導(dǎo)致內(nèi)存泄露。

所以即便有了智能指針,程序員還是要認真考慮使用它們的時機。

智能指針的本質(zhì)是所有權(quán)管理

所有權(quán)(Ownership)是一個用來管理動態(tài)分配內(nèi)存的記錄(bookkeeping)技術(shù)。動態(tài)分配內(nèi)存的所有者需要負責(zé)在所分配內(nèi)存不再需要時釋放它。共享所有權(quán)時,最后一個owner負責(zé)清理。即使不是共享,也可以在代碼間傳遞Ownership。

運用智能指針的核心是保持所有權(quán)(Ownership)的明確、清晰。一般情況下是保證所有權(quán)的單一,無論是使用WeakPtr, Scoped Pointer都可以保持所有權(quán)的單一,這時所有權(quán)可以在不同的對象/代碼段轉(zhuǎn)移。另一種情況就是需要共享所有權(quán),比較常用的引用指數(shù)智能指針,就是幫助完成共享所有權(quán)的。

概括起來三個要點:

1.局部化?
推薦保持單一、固定的所有權(quán)。當所有權(quán)需要在不同代碼段間傳遞時,就要使用智能指針。?
2.明確的清理時機。?
使用引用計數(shù),和std::auto_ptr都會引發(fā)對釋放時機的疑問。有可能引入一些隱晦的Bug。當需要共享所有權(quán)時,一定要先思考這個設(shè)計的必要性,以及內(nèi)存釋放的時機是否明確、清晰。?
3.最好的方式不要使用指針??梢允褂靡脕泶嬷羔?。見后面WebKit的故事。

大型項目中的應(yīng)用Google Coding Style的約定

如果需要動態(tài)分配內(nèi)存,盡量由分配的代碼來持有所有權(quán)。?
如果另一段代碼需要訪問對象,先考慮傳遞對象拷貝,指針或者引用,而不是傳遞所有權(quán)。如果確有需要時,建議使用std::unique_ptr來顯示的傳遞所有權(quán)(使用std::move())。?
除非有好的理由,否則不要共享所有權(quán)。比如為了避免復(fù)制。這時需要確定有明顯的性能收益,而且所持有的對象最好是只讀的, 同時建議使用std::shared_ptr:

std::shared_ptr;

1

新代碼里不要再使用scoped_ptr,更不要使用std::auto_ptr, 而是使用std::unique_ptr來代替。

WebKit的故事

WebKit文檔記錄了他們使用引用計數(shù)指針的故事,詳情見:RefPtr Basics。大意為:?
早在2005年時為了解決內(nèi)存泄露問題,開始使用基于引用計數(shù)的智能指針,但是它有性能問題,特別是當作函數(shù)參數(shù)和返回值傳遞時。后來使用C++11提供move語義(即轉(zhuǎn)移所有權(quán)的方式)來解決了這個問題。(另外shared_ptr const & 的形式也可以避免不必要的引用計數(shù)操作。)

而到了2013年,WebKit的開發(fā)者發(fā)現(xiàn)泛濫的判空和有效性檢查,于是開始傾向于盡可能地使用引用(注意:不是引用計數(shù)指針), 而不是指針。

小結(jié)

解決內(nèi)存問題的最佳的途徑仍然是由程序員管理好對象的生命周期。使用智能指針也是有成本的,同時也會引入一些新問題,所以需要遵循一些約定來使用。Google Chromium/Webkit都有相應(yīng)用的定義:

Chromium: Smart Pointer GuidelineWebKit: RefPtr Basics

另外明確約定一個函數(shù)是否會返回空指針,特別是對于API來說,也會幫助使用者避免一些不必要的判空處理和一些隱晦的Bug。

進一步學(xué)習(xí):

unique_ptr使用簡介Reference counting smart pointers are for retards.

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉