2010-07-14 31 views
0

假設您有一個稱爲Inst()的私有靜態方法,該方法允許類在其靜態方法中檢索應用程序中的單個實例。也許研究所()的定義是這樣..與存儲在本地中相比檢索對象的開銷

return App::GetApp()->CurrentState()->MyClass(); // Inst returns a reference 

比較這...

// I prefer this 
Inst().DoThis(); 
Inst().DoThat(); 
Inst().DoFoo(); 

到...

MyClass inst = Inst(); 
inst.DoThis(); 
inst.DoThat(); 
inst.DoFoo(); 

在應用中的性能是相當的重要,是第一組函數中的開銷不重要?現代編譯器能夠優化這些東西嗎?

我意識到profiling會回答我的問題,但我在這裏尋找經驗法則。將現有數據存儲在局部變量中而不是重新檢索它有什麼好處,還是現代編譯器通常優化的這種重新檢索?

+2

你的例子不同。第一個調用其他版本創建副本的引用上的函數。 – pmr 2010-07-14 20:28:01

+0

謝謝,沒有意識到分配給一個參考做一個副本。 (雖然我實際上限制了類中的拷貝構造函數和賦值,所以編譯器會抓住它)。 – kroz 2010-07-14 20:36:27

+0

它不。但是你沒有分配給_reference_('MyClass&inst'),但是你正在用它的拷貝構造函數('MyClass inst(const MyClass&)')初始化一個新的'MyClass'。 – 2010-07-14 20:42:29

回答

0

你擔心錯誤的事情,並自己回答了這個問題。對其進行分析並優化是否是瓶頸。

無論如何:Inst()可能會被內聯,所以沒有函數調用的開銷,因爲它是靜態的,結果不取決於任何明顯的外部參數,編譯器可能完全優化它。

相關問題