簡體   English   中英

C ++中的原始指針管理

[英]Raw Pointer Management in C++

我有一段性能關鍵代碼。 類和對象相當大,因此,它將作為指針存儲在STL容器中。 當基於某種邏輯需要將指向對象的指針存儲在多個不同的容器中時,就會出現問題。 處理對象的所有權非常混亂,因為我無法將對象的所有權隔離到單個容器中(我可以從單個容器中刪除它)。 除了使用智能指針(由於它對性能至關重要並且智能指針可能會影響性能)之外,我該怎么辦?

謝謝。

您要求的是不可能的事情-從某一方面講,您是在要求卓越的性能,以至於您聲稱無法提供的智能指針,並且您還恰巧要求安全和整潔。 好吧,實際上是以一個為代價的。 當然,您可以嘗試編寫自己的共享指針,該共享指針比boost的指針更輕巧,但仍提供基本功能。 順便說一句,您是否實際嘗試過 boost :: shared_ptr? 實際上降低了性能嗎?

您的問題很尷尬:您是否要求邏輯混亂?

實際上, shared_ptr性能令人難以置信,盡管您可以變得更好,但這可能是您的最佳選擇:它可以工作。

不過,您可以查找另一個Boost智能指針: boost :: intrusive_ptr

這是以前述代價為代價的: weak_ptr作為交換,允許為計數器和對象都具有單個內存分配。 將兩者組合在一起,可以顯着提高性能。

如果您沒有循環引用,請嘗試將其檢出,這可能正是您想要的。

侵入式智能指針通常比普通智能指針更有效,但比啞指針更容易。 例如,檢查boost::intrusive_ptr<T>

如果對象之間沒有相互引用,則可能需要嘗試手動引用計數。 添加到列表或從列表中刪除時會花費更多,但實際對象訪問沒有開銷。 (如果發現錯誤,這可能會很痛苦地進行診斷,因此,我建議謹慎處理。)

如果兩次操作之間有停滯時間,請考慮進行某種垃圾收集。 維護所有對象的列表(侵入列表可能會這樣做)。 如果您有時間,可以將其與其他列表進行交叉引用。 不在列表中的任何對象都可以刪除。 您不需要額外的數組來執行此操作(只需在每個對象上使用全局計數器和最后看到的計數器),這樣它就可以相當有效。

另一個選擇是使用提供對基礎指針的訪問的智能指針。 如果您想避免過多地調用重載的operator->的開銷,那么可能值得嘗試。 將智能指針存儲在列表中(這將為您進行生命周期管理),然后在運行對象時,您可以檢索每個對象的原始指針並使用該指針進行操作(因此,不會產生任何重載的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的微小開銷(對於保持調試版本的運行性比發布版本的運行更重要,但盡管如此,它很容易浪費時間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM