欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)

本篇文章為大家展示了怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),南城企業(yè)網(wǎng)站建設(shè),南城品牌網(wǎng)站建設(shè),網(wǎng)站定制,南城網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,南城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

對(duì)象池可以顯著提高性能,如果一個(gè)對(duì)象的創(chuàng)建非常耗時(shí)或非常昂貴,頻繁去創(chuàng)建的話會(huì)非常低效。對(duì)象池通過對(duì)象復(fù)用的方式來避免重復(fù)創(chuàng)建對(duì)象,它會(huì)事 先創(chuàng)建一定數(shù)量的對(duì)象放到池中,當(dāng)用戶需要?jiǎng)?chuàng)建對(duì)象的時(shí)候,直接從對(duì)象池中獲取即可,用完對(duì)象之后再放回到對(duì)象池中,以便復(fù)用。這種方式避免了重復(fù)創(chuàng)建耗 時(shí)或耗資源的大對(duì)象,大幅提高了程序性能。小編將探討對(duì)象池的技術(shù)特性以及源碼實(shí)現(xiàn)。

怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)

對(duì)象池類圖

  • ObjectPool:管理對(duì)象實(shí)例的pool。

  • Client:使用者。

適用性:

  • 類的實(shí)例可重用。

  • 類的實(shí)例化過程開銷較大。

  • 類的實(shí)例化的頻率較高。

效果:

  • 節(jié)省了創(chuàng)建類實(shí)例的開銷。

  • 節(jié)省了創(chuàng)建類實(shí)例的時(shí)間。

  • 存儲(chǔ)空間隨著對(duì)象的增多而增大。

問題

目前縱觀主流語言的實(shí)現(xiàn)方式無外乎3個(gè)步驟:

  1. 初始創(chuàng)建一定數(shù)量的對(duì)象池(也允許從外面添加對(duì)象)。

  2. 從對(duì)象池中取對(duì)象來使用。

  3. 用完之后返回對(duì)象池。

一般情況下這樣是OK的,可能存在的問題是在第三步,有兩個(gè)問題:

  1. 不方便,每次都需要顯式回收對(duì)象。

  2. 忘記將對(duì)象放回對(duì)象池,造成資源浪費(fèi)。

改進(jìn)動(dòng)機(jī)

解決顯式回收的問題,實(shí)現(xiàn)自動(dòng)回收,省心省力。改進(jìn)之后的對(duì)象池?zé)o須提供release方法,對(duì)象會(huì)自動(dòng)回收,改進(jìn)之后的類圖如下。

怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)

技術(shù)內(nèi)幕

借助c++11智能指針,因?yàn)橹悄苤羔樋梢宰远x刪除器,在智能指針釋放的時(shí)候會(huì)調(diào)用刪除器,在刪除器中我們將用完的對(duì)象重新放回對(duì)象池。思路比較簡(jiǎn)單,但實(shí)現(xiàn)的時(shí)候需要考慮兩個(gè)問題:

  1. 什么時(shí)候定義刪除器?

  2. 用shared_ptr還是unique_ptr?

1. 什么時(shí)候定義刪除器

自定義刪除器只做一件事,就是將對(duì)象重新放入對(duì)象池。如果對(duì)象池初始化的時(shí)候就自定義刪除器的話,刪除器中的邏輯是將對(duì)象放回對(duì)象池,放回的時(shí)候無 法再定義一個(gè)這樣的刪除器,所以這種做法行不通。需要注意,回收的對(duì)象只能是默認(rèn)刪除器的。除了前述原因之外,另外一個(gè)原因是對(duì)象池釋放的時(shí)候需要釋放所 有的智能指針,釋放的時(shí)候如果存在自定義刪除器將會(huì)導(dǎo)致對(duì)象無法刪除。只有在get的時(shí)候定義刪除器才行,但是初始創(chuàng)建或加入的智能指針是默認(rèn)刪除器,所 以我們需要把智能指針的默認(rèn)刪除器改為自定義刪除器。

1.2 用shared_ptr還是unique_ptr

因?yàn)槲覀冃枰阎悄苤羔樀哪J(rèn)刪除器改為自定義刪除器,用shared_ptr會(huì)很不方便,因?yàn)槟銦o法直接將shared_ptr的刪除器修改為自 定義刪除器,雖然你可以通過重新創(chuàng)建一個(gè)新對(duì)象,把原對(duì)象拷貝過來的做法來實(shí)現(xiàn),但是這樣做效率比較低。而unique_ptr由于是獨(dú)占語義,提供了一 種簡(jiǎn)便的方法方法可以實(shí)現(xiàn)修改刪除器,所以用unique_ptr是最適合的。

1.3 實(shí)現(xiàn)源碼

#pragma once #include <memory> #include <vector> #include <functional>  template <class T> class SimpleObjectPool { public:     using DeleterType = std::function<void(T*)>;      void add(std::unique_ptr<T> t)     {         pool_.push_back(std::move(t));     }      std::unique_ptr<T, DeleterType> get()     {         if (pool_.empty())         {             throw std::logic_error("no more object");         }          //every time add custom deleter for default unique_ptr         std::unique_ptr<T, DeleterType> ptr(pool_.back().release(), [this](T* t)         {             pool_.push_back(std::unique_ptr<T>(t));         });          pool_.pop_back();         return std::move(ptr);     }      bool empty() const     {         return pool_.empty();     }      size_t size() const     {         return pool_.size();     }  private:     std::vector<std::unique_ptr<T>> pool_; };  //test code void test_object_pool() {     SimpleObjectPool<A> p;     p.add(std::unique_ptr<A>(new A()));     p.add(std::unique_ptr<A>(new A()));     {         auto t = p.get();         p.get();     }      {         p.get();         p.get();     }      std::cout << p.size() << std::endl; }

如果你堅(jiān)持用shared_ptr,那么回收的時(shí)候你需要這樣寫:

std::shared_ptr<T> get() { if (pool_.empty()) {   throw std::logic_error("no more object"); }  std::shared_ptr<T> ptr = pool_.back(); auto p = std::shared_ptr<T>(new T(std::move(*ptr.get())), [this](T* t) {   pool_.push_back(std::shared_ptr<T>(t)); });  //std::unique_ptr<T, DeleterType> ptr(pool_.back().release(), [this](T* t) //{ // pool_.push_back(std::unique_ptr<T>(t)); //});  pool_.pop_back(); return p; }

這種方式需要每次都創(chuàng)建一個(gè)新對(duì)象,并且拷貝原來的對(duì)象,是一種比較低效的做法。代碼僅僅是為了展示如何實(shí)現(xiàn)自動(dòng)回收對(duì)象,沒有考慮線程安全、對(duì)象池?cái)U(kuò)容策略等細(xì)節(jié),源碼鏈接:object_pool

總結(jié)凡是需要自動(dòng)回收的場(chǎng)景下都可以使用這種方式:在獲取對(duì)象的時(shí)候?qū)⒛J(rèn)刪除器改為自定義刪除器,確保它可以回收。注意,回收的智能指針使用的是 默認(rèn)刪除器,可以確保對(duì)象池釋放時(shí)能正常釋放對(duì)象。同時(shí)也將獲取對(duì)象和釋放對(duì)象時(shí),對(duì)象的控制權(quán)完全分離。其他的一些應(yīng)用場(chǎng)景:多例模式,無需手動(dòng)釋放, 自動(dòng)回收。

上述內(nèi)容就是怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞標(biāo)題:怎么深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)
URL分享:http://aaarwkj.com/article34/ihhgpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)ChatGPT、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
日韩视频精品一区二区| 日本高清加勒比免费在线 | 亚洲欧美中文日韩一区| 午夜福利视频一区久久久| 久久精品国产亚洲av波多| 91九色视频官网在线观看| 亚洲日本精品免费在线观看| 果冻国产精品麻豆成人av| 日韩精品成人区中文字幕| 中文在线在线天堂中文| 久久久亚洲熟妇熟女一区二区| 亚洲午夜av久久乱码| 濑亚美莉在线观看一区二区三区| 日本东京热在线免费观看| 国产成人大片中文字幕在线| 中国一级黄片免费欧美| 夫妻在线观看高清视频| 蜜臀av午夜福利在线| 日本sm视频在线观看| 久久96国产精品久久秘臀| 欧美三级在线完整版免费| 日本欧美国产污黄在线观看| 亚洲精品国产av一区| 少妇欧美日韩精品在线观看| 男人天堂插插综合搜索| 天堂中文在线官网在线| 日本 一区二区在线| 美腿丝袜清纯唯美亚洲另类| 精品国产不卡在线观看| 日韩国产精品激情一区| 91伊人激情综合久久| 国产精品综合久久蜜臀av| 日本熟女俱乐部一区二区| av在线男人社区日韩| 日韩精品中文字幕影视| 日本精品国产一区二区在线| 免费观看毛片一区二区三区| 国产精品—色哟哟视频| 最新在线中文字幕av不卡| 91色综合久久久久婷婷| 亚洲理论电影在线观看|