多少使用智能指針,特別是提高:: shared_ptr的成本更比在時間和內存方面的裸指針?遊戲/嵌入式系統的性能密集型部分是否更好地使用裸指針?你會推薦使用裸指針或智能指針來提高性能?C++智能指針表現
回答
提領智能指針通常是微不足道的,當然在釋放模式升壓。所有的提升檢查都在編譯時間。 (智能指針理論上可以跨線程做出聰明的東西)。這仍然留下很多其他操作。尼古拉提到建築,複製和銷燬。雖然這不是完整的集合。其他重要的操作是交換,賦值和重置爲NULL。基本上,任何需要智能的操作。
注意,有些操作是由一些智能指針之外。例如。甚至無法複製boost::scoped_ptr
,更不用說分配了。由於這會減少操作,因此可以針對這些較少的方法對實現進行優化。
事實上,TR1來了,它很可能是編譯器可以用智能指針比原始指針做的更好。例如。編譯器可能會證明,在某些情況下,一個智能的非可複製指針不是別名,僅僅因爲它是不可複製的。考慮一下:當創建兩個指向同一對象的指針時,出現別名。如果第一個指針不能被複制,第二個指針將如何最終指向同一個對象? (有圍繞方面也是如此 - 符*必須返回一個左)
Boost提供了不同的智能指針。通常,根據智能指針的種類而變化的內存佔用與性能不應該成爲問題。對於性能比較,您可以檢查這個http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smarttests.htm。
正如你所看到的只是建築,複製和破壞都考慮到了性能比較,這意味着廢棄一個智能指針據稱具有相同的成本爲原始指針。
下面的代碼片段顯示,有被代替原始指針的使用shared_ptr<>
不損失性能
#include <iostream>
#include <tr1/memory>
int main()
{
#ifdef USE_SHARED_PTR
std::tr1::shared_ptr<volatile int> i(new int(1));
#else
volatile int * i = new int(1);
#endif
long long int h = 0;
for(long long int j=0;j < 10000000000LL; j++)
{
h += *i;
}
std::cout << h << std::endl;
return 0;
}
引用計數智能指針(最常見的類型),只有當你複製成本更多,創建和刪除它們。如果您複製很多,這些額外成本可能會很高,因爲它們大多數都是線程安全的。
如果你只是想一個「自動刪除」指針,有很多非議auto_ptr的,或由C++ 0x中的新的和有光澤(但不是很多尚未支援)的unique_ptr。
當我上次測試,用VC6,編譯器是無法與原始指針,以優化與智能指針的代碼,以及它可能。從那時起事情可能會發生變化。
處理性能問題的唯一方法是分析代碼。性能問題的最大部分無論如何都是想象的;只有分析才能指出你的瓶頸在哪裏。
如果事實證明,使用智能指針產生一個瓶頸,其中原始指針不使用原始指針!在此之前,我不會過多擔心;智能指針上的大多數操作都相當快。你可能會經常比較字符串(或類似的東西),以使它們重要。
在「手動」管理的std::vector<T*>
(即原始指針)和std::vector<boost::shared_ptr<T> >
之間有一個經常被忽略的中間房,其形式爲boost::ptr_container
類。
這些結合了原始指針容器的性能和智能指針容器的便利性(即它們提供了人們希望提供的STL容器std::auto_ptr
的功能,if that worked)。
- 1. C++:實現智能指針
- 2. C++智能指針
- 3. C++智能指針自己的實現
- 4. C++中的智能指針
- 5. Boost智能指針
- 6. 使用智能指針實現容器
- 7. 智能指針在智能指針管理數組內
- 8. 用智能指針替換現有的原始指針
- 9. 指針和智能指針的區別
- 10. 智能指針代替指針
- 11. C++ - 通過智能指針派生類
- 12. 智能指針和地圖在C++
- 13. C++橋樑模式和智能指針
- 14. C++智能指針const正確性
- 15. C++壽命返回智能指針
- 16. C++智能指針多態主義
- 17. 如何使用C++智能指針?
- 18. 帶智能指針的C++智能矢量?
- 19. C++智能指針:共享指針與共享數據
- 20. GMP和智能指針
- 21. 智能指針與PythonQt
- 22. 激活智能指針?
- 23. 智能指針::地圖
- 24. 二叉樹智能指針
- 25. 智能指針三規則?
- 26. 數組和智能指針
- 27. 智能指針和dynamic_cast
- 28. 智能指針類predeclaration
- 29. C++智能指針和指針指針輸出API。模板化的「包裝器」
- 30. 獲取智能指針的指針指針
不幸的是,您的想法優化智能指針不會工作,至少在C + +。在將其放入智能指針之前,您可能已將其存儲在其他地方。此外,通過執行&* smart_ptr,很容易(但不建議)將原始C指針移出智能指針。 – 2008-11-21 14:29:01
我同意克里斯傑佛遜。沒有人會阻止你將它存儲到其他地方,然後再將它放入智能指針 – 2008-11-28 17:31:38