2010-11-23 71 views
1

我有一塊性能嚴重的代碼。類和對象相當大,因此它將作爲指針存儲在STL容器中。當指向對象的指針需要根據某種邏輯存儲在多個不同的容器中時會出現問題。處理對象的所有權非常麻煩,因爲我無法將對象的所有權分離到單個容器(我可以從單個容器中刪除它)。除了使用智能指針(因爲它是性能關鍵和智能指針可能會影響性能),我該怎麼辦?C++中的原始指針管理

謝謝。

+7

嘗試智能指針。配置文件來檢查它是否有太大的影響。有機會,它不會太多,而且可能比大多數自己的解決方案都要少。 – sje397 2010-11-23 10:25:33

+1

不幸的是,你可以做的事情不多。您需要定義責任,即誰負責擁有您的資源。在我看來,這是C++的一個基本問題,也許是人們轉向其他語言的最大原因之一。 – 2010-11-23 10:27:49

+1

您是否勾畫了智能指針?還是僅僅是您的猜測? – Simone 2010-11-23 10:28:27

回答

5

你要求的是不可能 - 從某一點來說,你要求卓越的表現,例如你聲稱不能提供的智能指針,而且你也碰巧要求安全和整潔。那麼,其實一個是以另一個爲代價的。當然,你可以嘗試編寫自己的共享指針,它比boost更輕量級,但仍然提供基本功能。順便說一句,你有沒有試過 boost :: shared_ptr? 實際上減慢了性能嗎?

+2

關於`shared_ptr`的一點是:最好使用`make_shared`來構建它,它效率更高。 – 2010-11-23 10:32:23

1

你的問題很尷尬:你用一個凌亂的邏輯要求表現嗎?

shared_ptr真的有令人難以置信的表現,雖然你可以變得更好,但它可能是你最好的選擇:它的工作原理。

雖然您可以查找另一個Boost智能指針:boost::intrusive_ptr

這是以上述成本完成的:weak_ptr,並且交換允許爲計數器和對象分配單個存儲器。將這兩個包裝起來會使性能提高很小。

如果您沒有循環參考,請嘗試檢查它,這可能是您正在尋找的。

0

侵入式智能指針通常比普通的智能指針更高效,但比愚蠢指針更容易。例如,檢出boost::intrusive_ptr<T>

0

如果對象之間沒有引用,手動引用計數可能值得嘗試。添加到列表或從列表中刪除時會有更多的成本,但實際對象訪問沒有開銷。 (這可能會在診斷錯誤時很痛苦,所以我建議小心行事。)

如果在操作之間存在死區,請考慮一種垃圾收集。維護所有對象的列表(入侵列表可能會這樣做)。當你有時間備用時,與其他名單交叉引用;任何不在列表中的對象都可能被刪除。您不需要額外的數組來執行此操作(只是一個全局計數器和每個對象上的最後一個計數器),所以它可能相當有效。

另一種選擇是使用智能指針來提供對底層指針的訪問。如果你想盡量避免調用超載operator->的開銷,那麼這可能值得嘗試。將智能指針存儲在列表中(這會爲您提供生命週期管理),然後在運行對象時,您可以檢索每個對象的原始指針並使用該指針進行操作(因此不會產生任何超載的開銷)。 )。例如:

std::vector<smart_ptr<T> > objects; 

if(!objects.empty()) { 
    smart_ptr<T> *objects_raw=&objects[0]; 
    for(size_t n=objects.size(),i=0;i<n;++i) { 
     T *object=objects_raw[i].get_ptr(); 

     // do stuff 
    } 
} 

這是我個人比較喜歡的方式。長期存儲獲得一個智能指針,短期存儲獲得一個簡單的指針。對象的生命週期很容易管理,並且不會受到1,000,000個微小開銷的影響(對於保持調試版本的可運行性而言,比發佈版本更重要,但它很容易增加浪費的時間)。