2015-01-02 54 views
-1

因此,例如,其中這些是更快:方法鏈接緩慢C++?

if(object.GetMemberX().IsSomething()) 
{ 
    Store(object.GetMemberX()); 
    object.GetMemberX().FlagSomething(); 
} 

typeX x = object.GetMemberX(); 
if(typeX.IsSomething()) 
{ 
    Store(x); 
    x.FlagSomething(); 
} 

我想像,如果GetMemberX()返回一個指針或在第一個例子中然後參考,編譯器不能優化將兩個調用放在一起,因爲它不能保證每次調用返回的指針/引用都是相同的?

但在第二個例子中,我存儲它?

如果這是真的,它只適用於返回指針/引用的方法嗎?如果我的方法按價值回報,它們會受益於不同的電話嗎?

+3

猜測優化器可以做什麼和不能做什麼通常很難做...像取消引用一個函數這樣的東西不應該花很多時間。 。如果你處於某種性能至關重要的緊密循環中,那麼你應該分析並查看正在花費的時間。 –

+0

在對你很重要的環境中對其進行基準測試。 – OMGtechy

+0

IsSomething是一個靜態函數嗎? – BDL

回答

2

第二個版本更具可讀性。但是,它可能會調用typeX的拷貝構造函數。是可讀的快,使用引用或指針:

typeX& x = object.GetMemberX(); 
if(typeX.IsSomething()) 
{ 
    Store(x); 
    x.FlagSomething(); 
} 

,你不應該使用一個參考的唯一情況是,當object.GetMemberX()收益率的值,在這種情況下,你的第二個版本是要走的路。在這種情況下,存儲返回值不會產生開銷,因爲編譯器可以優化拷貝(copy elision)。

+0

請問您可以擴展一下嗎?爲什麼它更快?它是否適用於值和引用相同? – NeomerArcana

+0

第一個版本是有點關閉,我現在糾正它。參考速度更快,因爲您可以避免不必要的函數調用,該調用至少需要10到20個CPU週期。 – cmaster

+0

所以,如果按價值回報,我不應該鏈接。如果通過引用或指針返回,我不應該鏈?永遠不要鏈? – NeomerArcana

5

這個問題不能在C++通用上下文中回答......因爲它取決於編譯器實現和優化級別!

甚至不能確定某個特定優化級別的特定編譯器不會爲這兩個版本生成完全相同的代碼,因爲最終這些操作應該是相同的。

我的建議是隻使用通用規則:首先編寫可讀的代碼(由你和可能的同伴......)。什麼時候出現性能問題,簡要介紹該方案,並且只是通過對不同可能性進行基準測試來優化應得的小部件。

當然,上述問題主要涉及低層次的優化,比如你在這裏問的問題。你應該總是選擇與期望的使用相一致的algorythms ...