日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
手擼一個對象池,你學會了嗎?

 什么是對象池?

對象的池子,與線程池、內(nèi)存池類似,減少頻繁創(chuàng)建和銷毀對象帶來的成本(特別是消耗資源較大的對象),可用于實現(xiàn)對象的緩存和復用。這也算是一種設計模式。

話不多說,直接上代碼:

 
 
 
  1. #include 
  2. #include 
  3. #include 
  4. #include 
  5. #include 
  6. #include 
  7. #include 
  8. #include 
  9. struct A {
  10.     A(std::string s) { str_ = std::move(s); }
  11.     void print() { std::cout << str_ << std::endl; }
  12.     std::string str_;
  13. };
  14. template >
  15. class ObjectPool {
  16.    public:
  17.     ObjectPool() = default;
  18.     ~ObjectPool() {
  19.         assert(freeObjects_.size() == kInitChunkSize * (std::pow(2, pool_.size()) - 1));
  20.         size_t chunkSize{kInitChunkSize};
  21.         for (auto* chunk : pool_) {
  22.             allocator_.deallocate(chunk, chunkSize);
  23.             chunkSize *= 2;
  24.         }
  25.         pool_.clear();
  26.     }
  27.     template 
  28.     std::shared_ptr acquireObject(Args... args) {
  29.         if (freeObjects_.empty()) {
  30.             addChunk();
  31.         }
  32.         T* object{freeObjects_.back()};
  33.         new (object) T{std::forward(args)...};
  34.         freeObjects_.pop_back();
  35.         return std::shared_ptr(object, [this](T* object) {
  36.             std::_Destroy(object);
  37.             freeObjects_.push_back(object);
  38.         });
  39.     }
  40.    private:
  41.     std::vector pool_;
  42.     std::vector freeObjects_;
  43.     static const size_t kInitChunkSize{5};
  44.     size_t newChunkSize{kInitChunkSize};
  45.     void addChunk() {
  46.         std::cout << "add Chunk \n";
  47.         auto* firstNewObject{allocator_.allocate(newChunkSize)};
  48.         pool_.push_back(firstNewObject);
  49.         auto oldFreeObjectSize{freeObjects_.size()};
  50.         freeObjects_.resize(oldFreeObjectSize + newChunkSize);
  51.         std::iota(std::begin(freeObjects_) + oldFreeObjectSize, std::end(freeObjects_), firstNewObject);
  52.         newChunkSize *= 2;
  53.     }
  54.     Allocator allocator_;
  55. };
  56. using APool = ObjectPool;
  57. int main() {
  58.     APool pool;
  59.     for (int i = 0; i < 20; i++) {
  60.         auto x = pool.acquireObject(std::string("hello"));
  61.         x->print();
  62.     }
  63.     return 0;
  64. }

上面的對象池實現(xiàn)在每次請求對象的時候都調(diào)用了構造函數(shù)和析構函數(shù),這里大家可以根據(jù)實際情況自行選擇是否必要調(diào)用。如果構造和析構成本也比較高,可以再想辦法節(jié)省對應的開銷。


文章名稱:手擼一個對象池,你學會了嗎?
文章網(wǎng)址:
http://www.5511xx.com/article/djdhcgj.html