欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何實現(xiàn)C++對象池自動回收技術(shù)

這篇文章主要介紹了如何實現(xiàn)C++對象池自動回收技術(shù),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計,耒陽網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:耒陽等地區(qū)。耒陽做網(wǎng)站價格咨詢:18982081108

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

如何實現(xiàn)C++對象池自動回收技術(shù)

對象池類圖

ObjectPool:管理對象實例的pool。

Client:使用者。

適用性:

類的實例可重用。

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

類的實例化的頻率較高。

效果:

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

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

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

問題

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

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

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

用完之后返回對象池。

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

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

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

改進動機

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

如何實現(xiàn)C++對象池自動回收技術(shù)

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

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

什么時候定義刪除器?以及用shared_ptr還是unique_ptr?下面我們一起來看一下: 

1. 什么時候定義刪除器

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

2 .用shared_ptr還是unique_ptr

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

2.實現(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;
}

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

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)建一個新對象,并且拷貝原來的對象,是一種比較低效的做法。代碼僅僅是為了展示如何實現(xiàn)自動回收對象,沒有考慮線程安全、對象池擴容策略等細節(jié)

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何實現(xiàn)C++對象池自動回收技術(shù)”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

網(wǎng)站名稱:如何實現(xiàn)C++對象池自動回收技術(shù)
本文URL:http://chinadenli.net/article26/gicjcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、品牌網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)站策劃全網(wǎng)營銷推廣、網(wǎng)站導(dǎo)航

廣告

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

成都做網(wǎng)站