2008-11-21 99 views
18

多少使用智能指針,特別是提高:: shared_ptr的成本更比在時間和內存方面的裸指針?遊戲/嵌入式系統的性能密集型部分是否更好地使用裸指針?你會推薦使用裸指針或智能指針來提高性能?C++智能指針表現

回答

21

提領智能指針通常是微不足道的,當然在釋放模式升壓。所有的提升檢查都在編譯時間。 (智能指針理論上可以跨線程做出聰明的東西)。這仍然留下很多其他操作。尼古拉提到建築,複製和銷燬。雖然這不是完整的集合。其他重要的操作是交換,賦值和重置爲NULL。基本上,任何需要智能的操作。

注意,有些操作是由一些智能指針之外。例如。甚至無法複製boost::scoped_ptr,更不用說分配了。由於這會減少操作,因此可以針對這些較少的方法對實現進行優化。

事實上,TR1來了,它很可能是編譯器可以用智能指針比原始指針做的更好。例如。編譯器可能會證明,在某些情況下,一個智能的非可複製指針不是別名,僅僅因爲它是不可複製的。考慮一下:當創建兩個指向同一對象的指針時,出現別名。如果第一個指針不能被複制,第二個指針將如何最終指向同一個對象? (有圍繞方面也是如此 - 符*必須返回一個左)

+0

不幸的是,您的想法優化智能指針不會工作,至少在C + +。在將其放入智能指針之前,您可能已將其存儲在其他地方。此外,通過執行&* smart_ptr,很容易(但不建議)將原始C指針移出智能指針。 – 2008-11-21 14:29:01

+0

我同意克里斯傑佛遜。沒有人會阻止你將它存儲到其他地方,然後再將它放入智能指針 – 2008-11-28 17:31:38

7

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; 
} 
2

引用計數智能指針(最常見的類型),只有當你複製成本更多,創建和刪除它們。如果您複製很多,這些額外成本可能會很高,因爲它們大多數都是線程安全的。

如果你只是想一個「自動刪除」指針,有很多非議auto_ptr的,或由C++ 0x中的新的和有光澤(但不是很多尚未支援)的unique_ptr。

2

當我上次測試,用VC6,編譯器是無法與原始指針,以優化與智能指針的代碼,以及它可能。從那時起事情可能會發生變化。

6

處理性能問題的唯一方法是分析代碼。性能問題的最大部分無論如何都是想象的;只有分析才能指出你的瓶頸在哪裏。

如果事實證明,使用智能指針產生一個瓶頸,其中原始指針不使用原始指針!在此之前,我不會過多擔心;智能指針上的大多數操作都相當快。你可能會經常比較字符串(或類似的東西),以使它們重要。

2

在「手動」管理的std::vector<T*>(即原始指針)和std::vector<boost::shared_ptr<T> >之間有一個經常被忽略的中間房,其形式爲boost::ptr_container類。

這些結合了原始指針容器的性能和智能指針容器的便利性(即它們提供了人們希望提供的STL容器std::auto_ptr的功能,if that worked)。