在分析我的應用程序後,我發現有太多的malloc
s。我很驚訝,shared_ptr
和shared_array
分配內存的引用計數。除了封裝引用計數的對象還包含兩個計數uses_count
和weak_count
以及一個指向虛擬表的指針。對我來說,當我只需要一個簡單的引用計數類時,這看起來好像過火了。有什麼辦法可以調整shared_ptr
和shared_array
來實現一個更簡單的方案嗎?沒有額外的電話malloc
和只有一個計數器:uses_count
。或者在STL或Boost中有一個更簡單的類?shared_ptr和shared_array爲參考計數器分配內存
2
A
回答
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可以解決它;
相關問題
- 1. boost :: shared_array和對齊的內存分配
- 2. shared_array的元素爲shared_ptr?
- 3. std :: shared_ptr預分配內存
- 4. 本地參考和現場參考內存分配
- 5. 這是否爲shared_ptr分配新內存?
- 6. C++參考shared_ptr vs參考
- 7. 參考計數器和RVO
- 8. 參考計數對象和多個分配器
- 9. shared_ptr分配:引用計數的順序
- 10. 參考分配
- 11. 按功能分配和參考數據
- 12. 如何配置shared_ptr引用計數器?
- 13. 內存分配的值類型內參考類型在.net
- 14. 將std :: shared_ptr設置爲指向參考
- 15. Boost shared_ptr和內存分配不起作用
- 16. boost shared_ptr騎行參考?
- 17. 爲雙參數傳遞的參數分配內存
- 18. 爲數組分配內存
- 19. 參考其計數器值
- 20. shared_ptr空指針和分配
- 21. 百分比配置參數參考
- 22. 爲何讀取參考計數器值作爲參考 - 易失性常數?
- 23. 爲什麼在使用shared_ptr作爲函數參數時存在內存泄漏?
- 24. 存在shared_ptr的計數
- 25. 參考變量訪問動態分配的內存
- 26. C計數分配的內存
- 27. 的shared_ptr和引用計數器
- 28. 參考內置帳戶UserId作爲外鍵分配到模型
- 29. shared_ptr分配優化
- 30. 內存管理和標準::分配器
使用'make_shared'。 –
這正是我不使用shared_ptr等的原因。特別是,因爲這意味着我不會允許從一個普通指針創建一個智能指針,迫使我使用額外的間接級別等。唯一干淨的方法爲了引用計數,我知道的是:在基類中實現它並從中派生所有東西。添加一個智能指針模板,並且你有一些可用的東西,沒有任何微妙的捕獲。 STL的方法是一個明智的恕我直言,太多的修復。 – cmaster
@cmaster基礎類中的實現已經完成了:'boost :: intrusive_ptr' ;-) –