2011-05-18 45 views
3

我意識到創建,分配,複製和銷燬std :: tr1 :: shared_ptr或boost :: shared_ptr(由於引用計數機制)有一個(有時是重要的)性能命中。一旦構造,訪問由shared_ptr包裝的指針是否沒有性能損失?解除引用std :: tr1:shared_ptr與解引用裸指針的任何命中?

換句話說:給予

std::tr1::shared_ptr<myClass> SharedA(new myClass); 
myClass *NakedA = new myClass; 

確實

SharedA->someClassMember 

具有相同的開銷

NakedA->someClassMember 

+6

我不知道,當你測量它會發生什麼? – 2011-05-18 18:37:20

+0

有什麼選擇?即使需要,也不使用shared_ptr? – 2011-05-18 18:41:08

+0

@Doug T.-在簡單的測試用例中,似乎沒有什麼區別,但是在我正在處理的大代碼中,我的分析器在訪問指針時顯示出一些開銷(儘管它看起來應該內聯,因此沒有什麼區別) – MarkD 2011-05-18 18:45:49

回答

9

在沒有調試支持的優化版本中,不應該有任何開銷。你可以看看你正在使用的實現。很有可能,它的operator->重載只是返回指向指向對象的指針,而它的operator*重載只是取消引用這個指針。 (這是std::shared_ptr的Visual C++ 2010實現所做的:這些重載操作符中的每一個都只是調用一個只返回指針的「get」函數;不存在任何類型的鎖定或其他開銷,其他實現可能是不同)。

未優化的版本可能不會內聯運算符重載,如果您的實現具有額外的調試支持,您可以執行額外的檢查(例如,如果您取消引用空指針,可能是斷言)。

+0

謝謝詹姆斯 - 這是我懷疑的,但如果我沒有看清楚,不想繼續追逐我的尾巴。 – MarkD 2011-05-18 18:58:00

3

智能指針的所有成員函數(包括取消引用操作符)都可以內聯。任何好的編譯器應該優化了抽象。