成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何實(shí)現(xiàn)C++對(duì)象池自動(dòng)回收技術(shù)-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)專注于城西網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供城西營(yíng)銷型網(wǎng)站建設(shè),城西網(wǎng)站制作、城西網(wǎng)頁(yè)設(shè)計(jì)、城西網(wǎng)站官網(wǎng)定制、小程序定制開(kāi)發(fā)服務(wù),打造城西網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供城西網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

對(duì)象池可以顯著提高性能,如果一個(gè)對(duì)象的創(chuàng)建非常耗時(shí)或非常昂貴,頻繁去創(chuàng)建的話會(huì)非常低效。對(duì)象池通過(guò)對(duì)象復(fù)用的方式來(lái)避免重復(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)。

如何實(shí)現(xiàn)C++對(duì)象池自動(dòng)回收技術(shù)

對(duì)象池類圖

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

Client:使用者。

適用性:

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

類的實(shí)例化過(guò)程開(kāi)銷較大。

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

效果:

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

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

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

問(wèn)題

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

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

從對(duì)象池中取對(duì)象來(lái)使用。

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

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

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

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

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

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

如何實(shí)現(xiàn)C++對(duì)象池自動(dòng)回收技術(shù)

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

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

什么時(shí)候定義刪除器?以及用shared_ptr還是unique_ptr?下面我們一起來(lái)看一下:

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

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

2 .用shared_ptr還是unique_ptr

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

2.實(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í)候你需要這樣寫(xiě):

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ì)象,并且拷貝原來(lái)的對(duì)象,是一種比較低效的做法。代碼僅僅是為了展示如何實(shí)現(xiàn)自動(dòng)回收對(duì)象,沒(méi)有考慮線程安全、對(duì)象池?cái)U(kuò)容策略等細(xì)節(jié)

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享文章:如何實(shí)現(xiàn)C++對(duì)象池自動(dòng)回收技術(shù)-創(chuàng)新互聯(lián)
地址分享:http://jinyejixie.com/article2/dchiic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、建站公司、網(wǎng)站制作ChatGPT、網(wǎng)站排名網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
阿拉善盟| 银川市| 洪泽县| 宿州市| 三亚市| 民丰县| 石嘴山市| 新泰市| 霍山县| 长汀县| 同江市| 昌乐县| 靖边县| 洪江市| 中山市| 石景山区| 孟村| 宁远县| 东城区| 武宣县| 甘南县| 孟津县| 林周县| 双辽市| 丰顺县| 家居| 土默特左旗| 塘沽区| 吉首市| 昌都县| 迁西县| 怀来县| 怀远县| 连云港市| 建水县| 鹤庆县| 会同县| 民权县| 济南市| 广州市| 牙克石市|