2013-07-08 41 views
2

在分析我的應用程序後,我發現有太多的malloc s。我很驚訝,shared_ptrshared_array分配內存的引用計數。除了封裝引用計數的對象還包含兩個計數uses_countweak_count以及一個指向虛擬表的指針。對我來說,當我只需要一個簡單的引用計數類時,這看起來好像過火了。有什麼辦法可以調整shared_ptrshared_array來實現一個更簡單的方案嗎?沒有額外的電話malloc和只有一個計數器:uses_count。或者在STL或Boost中有一個更簡單的類?shared_ptr和shared_array爲參考計數器分配內存

+6

使用'make_shared'。 –

+0

這正是我不使用shared_ptr等的原因。特別是,因爲這意味着我不會允許從一個普通指針創建一個智能指針,迫使我使用額外的間接級別等。唯一干淨的方法爲了引用計數,我知道的是:在基類中實現它並從中派生所有東西。添加一個智能指針模板,並且你有一些可用的東西,沒有任何微妙的捕獲。 STL的方法是一個明智的恕我直言,太多的修復。 – cmaster

+1

@cmaster基礎類中的實現已經完成了:'boost :: intrusive_ptr' ;-) –

回答

4

如果使用boost::make_shared,該函數將分配兩個裁判櫃檯,在一個單一的呼叫new對象的內存。 弱引用的附加計數器不應該是一個大問題,因爲它只有一個額外的4或8個字節,不會受到傷害。
如果分析顯示shared_ptr的實現仍然是您的應用程序的瓶頸,請考慮使用boost::intrusive_ptr。同時尋找通過引用而不是按值傳遞shared_ptrs,或者在需要複製時移動它們來傳遞它們。當然,如果你可以使用unique_ptr你應該更喜歡那些在shared_ptr小號

+0

謝謝! intrusive_ptr就是我一直在尋找的東西。 – Max

0
shared_ptr<A> sp(new A(), A_Deleter(), My_allocator<A>()); 

    template <typename T> 
    class My_allocator 
    { 
     ... 
     T * allocate(const size_t n) const { 
      return singleton_pool<T,sizeof(T)>::malloc(); 
     } 
     .... 
    }; 

我想你抱怨內存使用問題。我發現std allocator可以解決它;