国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

深度剖析 C++ 對象池自動回收技術實現

開發 后端
對象池可以顯著提高性能,如果一個對象的創建非常耗時或非常昂貴,頻繁去創建的話會非常低效。對象池通過對象復用的方式來避免重復創建對象,它會事 先創建一定數量的對象放到池中,當用戶需要創建對象的時候,直接從對象池中獲取即可,用完對象之后再放回到對象池中,以便復用。

對象池可以顯著提高性能,如果一個對象的創建非常耗時或非常昂貴,頻繁去創建的話會非常低效。對象池通過對象復用的方式來避免重復創建對象,它會事 先創建一定數量的對象放到池中,當用戶需要創建對象的時候,直接從對象池中獲取即可,用完對象之后再放回到對象池中,以便復用。這種方式避免了重復創建耗 時或耗資源的大對象,大幅提高了程序性能。本文將探討對象池的技術特性以及源碼實現。

對象池類圖

  • ObjectPool:管理對象實例的pool。

  • Client:使用者。

適用性:

  • 類的實例可重用。

  • 類的實例化過程開銷較大。

  • 類的實例化的頻率較高。

效果:

  • 節省了創建類實例的開銷。

  • 節省了創建類實例的時間。

  • 存儲空間隨著對象的增多而增大。

問題

目前縱觀主流語言的實現方式無外乎3個步驟:

  1. 初始創建一定數量的對象池(也允許從外面添加對象)。

  2. 從對象池中取對象來使用。

  3. 用完之后返回對象池。

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

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

  2. 忘記將對象放回對象池,造成資源浪費。

改進動機

解決顯式回收的問題,實現自動回收,省心省力。改進之后的對象池無須提供release方法,對象會自動回收,改進之后的類圖如下。


技術內幕

借助c++11智能指針,因為智能指針可以自定義刪除器,在智能指針釋放的時候會調用刪除器,在刪除器中我們將用完的對象重新放回對象池。思路比較簡單,但實現的時候需要考慮兩個問題:

  1. 什么時候定義刪除器?

  2. 用shared_ptr還是unique_ptr?

1. 什么時候定義刪除器

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

1.2 用shared_ptr還是unique_ptr

因為我們需要把智能指針的默認刪除器改為自定義刪除器,用shared_ptr會很不方便,因為你無法直接將shared_ptr的刪除器修改為自 定義刪除器,雖然你可以通過重新創建一個新對象,把原對象拷貝過來的做法來實現,但是這樣做效率比較低。而unique_ptr由于是獨占語義,提供了一 種簡便的方法方法可以實現修改刪除器,所以用unique_ptr是最適合的。

1.3 實現源碼

 

  1. #pragma once 
  2. #include <memory> 
  3. #include <vector> 
  4. #include <functional> 
  5.  
  6. template <class T> 
  7. class SimpleObjectPool 
  8. public
  9.     using DeleterType = std::function<void(T*)>; 
  10.  
  11.     void add(std::unique_ptr<T> t) 
  12.     { 
  13.         pool_.push_back(std::move(t)); 
  14.     } 
  15.  
  16.     std::unique_ptr<T, DeleterType> get() 
  17.     { 
  18.         if (pool_.empty()) 
  19.         { 
  20.             throw std::logic_error("no more object"); 
  21.         } 
  22.  
  23.         //every time add custom deleter for default unique_ptr 
  24.         std::unique_ptr<T, DeleterType> ptr(pool_.back().release(), [this](T* t) 
  25.         { 
  26.             pool_.push_back(std::unique_ptr<T>(t)); 
  27.         }); 
  28.  
  29.         pool_.pop_back(); 
  30.         return std::move(ptr); 
  31.     } 
  32.  
  33.     bool empty() const 
  34.     { 
  35.         return pool_.empty(); 
  36.     } 
  37.  
  38.     size_t size() const 
  39.     { 
  40.         return pool_.size(); 
  41.     } 
  42.  
  43. private
  44.     std::vector<std::unique_ptr<T>> pool_; 
  45. }; 
  46.  
  47. //test code 
  48. void test_object_pool() 
  49.     SimpleObjectPool<A> p; 
  50.     p.add(std::unique_ptr<A>(new A())); 
  51.     p.add(std::unique_ptr<A>(new A())); 
  52.     { 
  53.         auto t = p.get(); 
  54.         p.get(); 
  55.     } 
  56.  
  57.     { 
  58.         p.get(); 
  59.         p.get(); 
  60.     } 
  61.  
  62.     std::cout << p.size() << std::endl; 
  63. } 

如果你堅持用shared_ptr,那么回收的時候你需要這樣寫:

  1. std::shared_ptr<T> get() 
  2. if (pool_.empty()) 
  3.   throw std::logic_error("no more object"); 
  4.  
  5. std::shared_ptr<T> ptr = pool_.back(); 
  6. auto p = std::shared_ptr<T>(new T(std::move(*ptr.get())), [this](T* t) 
  7.   pool_.push_back(std::shared_ptr<T>(t)); 
  8. }); 
  9.  
  10. //std::unique_ptr<T, DeleterType> ptr(pool_.back().release(), [this](T* t) 
  11. //{ 
  12. // pool_.push_back(std::unique_ptr<T>(t)); 
  13. //}); 
  14.  
  15. pool_.pop_back(); 
  16. return p; 

這種方式需要每次都創建一個新對象,并且拷貝原來的對象,是一種比較低效的做法。代碼僅僅是為了展示如何實現自動回收對象,沒有考慮線程安全、對象池擴容策略等細節,源碼鏈接:object_pool

總結凡是需要自動回收的場景下都可以使用這種方式:在獲取對象的時候將默認刪除器改為自定義刪除器,確保它可以回收。注意,回收的智能指針使用的是 默認刪除器,可以確保對象池釋放時能正常釋放對象。同時也將獲取對象和釋放對象時,對象的控制權完全分離。其他的一些應用場景:多例模式,無需手動釋放, 自動回收。

責任編輯:王雪燕 來源: 祁宇
相關推薦

2021-08-29 22:05:04

對象自動回收

2010-01-28 16:31:54

C++類型

2010-01-15 10:32:21

C++語言

2010-01-26 14:46:42

C++語言

2010-01-13 13:42:55

C++編譯器

2010-01-13 10:16:42

C++軟件

2010-01-26 17:16:33

C++應用程序

2010-01-28 14:54:01

C++資源管理

2010-01-27 15:50:23

C++復雜性

2012-02-17 10:50:10

Java

2023-02-21 15:26:26

自動駕駛特斯拉

2010-01-11 10:19:57

C++開發工具

2010-01-11 17:43:23

C++程序設計

2010-01-13 11:14:06

C++虛表

2009-09-10 17:37:01

C# get post

2010-01-12 15:03:33

C++代碼

2010-01-14 17:42:47

CC++

2010-02-03 16:56:24

Python包

2025-05-06 09:12:46

2010-02-02 13:22:06

Python面向對象
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕国产精品| 一区二区在线| 国产精品成人一区二区| 日韩一区欧美二区| 一道本在线免费视频| 538在线一区二区精品国产| 99热这里有精品| 国产欧美一区二区三区久久人妖| 韩国一区二区三区| 四虎影视精品成人| 欧美成人精品在线观看| 99亚洲伊人久久精品影院红桃| 能在线观看的av| 91精品综合久久久久久| 亚洲激情77| 国产精品久久久影院| 欧美主播一区二区三区| 成人午夜大片| 99热都是精品| 欧美最新大片在线看| 大伊香蕉精品在线品播放| 亚洲人成77777| 在线观看视频一区| 国产日韩三级| 五月天在线免费视频| 日本精品视频一区二区| av成人男女| 激情五月五月婷婷| 欧美二区在线观看| 色爱综合网欧美| 人人干人人干人人| 国产午夜精品全部视频播放| 国产亚洲精品自拍| 日本一区高清| 国产精品jizz在线观看麻豆| 91免费看片在线观看| 1区2区在线观看| 99国产超薄丝袜足j在线观看| 国产精品伦一区二区三级视频| 一区二区三区四区日本视频| 久久久久久久久一区| 欧美香蕉大胸在线视频观看 | 日韩在线欧美在线| 亚洲男人影院| av一区在线观看| 91av一区二区三区| 亚洲.国产.中文慕字在线| 欧美a大片欧美片| 国产情侣av自拍| 欧美精品在线播放| 91美女福利视频| 国内精品伊人| 精品无码av无码免费专区| 亚洲国产成人爱av在线播放| 日韩精品一级二级| 尤物yw193can在线观看| 蜜桃av色综合| 在线不卡中文字幕播放| 亚洲视频成人| 麻豆传媒视频在线观看免费| 久久精品国产一区二区三区不卡| 91成人在线观看喷潮| 综合av在线| 国产二区在线播放| 精品视频在线观看| 在线播放91灌醉迷j高跟美女 | 极品裸体白嫩激情啪啪国产精品| 永久免费在线| 亚洲精品免费av| 精品视频1区2区| 欧美中文日韩| 日本在线啊啊| 国产va亚洲va在线va| 精品国内产的精品视频在线观看| www.日韩在线| 玖玖玖免费嫩草在线影院一区| 成人免费在线观看视频网站| 4438全国亚洲精品在线观看视频| 亚洲美女在线一区| 五月天久久久| 国产午夜精品久久久久免费视| 日本在线一区| 亚洲天堂免费在线| 久久久精品免费网站| 婷婷综合成人| 狠狠狠综合7777久夜色撩人| 鲁鲁狠狠狠7777一区二区| 亚洲成人激情视频| 成人亚洲一区二区一| 国产色噜噜噜91在线精品| 中文资源在线网| 欧美国产一区二区在线| 日韩成人激情在线| 欧美激情一区二区在线| 91综合网人人| 欧美另类tv| 成年人在线看片| 91亚洲精品视频| 欧美精品一区二区高清在线观看 | 日韩精品在线观看一区| 久久这里只有精品首页| 你懂的视频欧美| 黄色片在线播放| 亚洲一区bb| 欧美国产视频一区二区| 精品久久久久久久久久国产| 丝袜美腿亚洲综合| 亚洲国产aⅴ精品一区二区| 中国在线观看免费国语版电影| 日韩国产高清一区| 欧美www在线| 欧美三级一区二区| 99视频超级精品| 午夜日韩在线| 日韩av懂色| 国产区av在线| 91精品国产91久久久久麻豆 主演| 日本午夜人人精品| 日韩精品在线一区二区| 国产精品午夜久久| 久久精品一区| 亚洲图片久久| 春色校园综合激情亚洲| 超级碰碰视频| 亚洲天堂电影网| 国产福利精品在线| 日韩高清免费在线| 亚洲综合丝袜美腿| 狠狠色丁香九九婷婷综合五月| 欧美日韩久久精品| 国产综合av| 9191在线| www.999av| av磁力番号网| 成人黄动漫网站免费| 欧美成人免费网| 欧美丰满嫩嫩电影| 亚洲欧美视频在线观看| 久99久精品视频免费观看| 欧美精选一区二区三区| 国产 日韩 欧美一区| 国产在线自天天| 午夜国产一区二区三区| 亚洲精品一区二区三区av| 国产精品av免费在线观看| 一区二区三区国产视频| 在线观看成人小视频| 亚洲国产精品av| 久久精品久久精品| 香港欧美日韩三级黄色一级电影网站| 国产欧美视频在线| 2021天堂中文幕一二区在线观| 小水嫩精品福利视频导航| 亚洲成熟丰满熟妇高潮xxxxx| 日本一区二区三区免费观看| 国产美女精品视频| 久久久中精品2020中文| 亚洲女人被黑人巨大进入al| 欧美日韩五月天| 午夜婷婷国产麻豆精品| 国产视频一区在线观看| 国产精品一二三四| 国产美女一区| 国产精品sm| 久久国产亚洲| 亚洲理论电影| 91嫩草精品| 国产一区二区三区国产精品| www.成人爱| av小说在线播放| 免费不卡视频| 国产三级在线观看| 久草电影在线| 日本fc2在线观看| 日本www.色| 妺妺窝人体色www在线小说| 午夜在线视频免费观看| 欧美日韩精品一区| 精品久久一区二区三区蜜桃| 91在线看网站| 国产精品亚洲第一区| 国产成人精品视频在线| 欧美一区二区三区免费视| 久久久亚洲福利精品午夜| 欧美日韩成人网| 久久99久国产精品黄毛片入口| 精品国模在线视频| 久久国产精品久久久| 久久精品99国产精品酒店日本| 亚洲一区二区国产| 中文字幕日韩欧美精品在线观看| 亚洲全黄一级网站| 亚洲视频国产视频| 在线国产精品视频| 久久亚洲精品一区| 欧美精品久久久久| 热re99久久精品国产66热| 欧美做受高潮电影o| 国产精品高清免费在线观看| 国产日本欧美一区二区三区在线|