2014-10-03 27 views
1

請看下面的例子:實際實例化標籤分派對象嗎?

class MyHeavyObject 
{ 
    MyHeavyObject() 
    { 
     // lots of initialisation 
     // ... 
    } 
}; 

template<typename T> 
void RegisterObject(T) 
{ 
    DoSomethingWith<T>(); 
} 

現在,如果我叫

RegisterObject(MyHeavyObject()); 

將編譯器理解MyHeavyObject從未實際使用和優化呼叫,或將對象的實例被創建?我會對這個標準所說的和編譯器的實際操作感興趣。

+0

我相信任何允許編譯器對其進行optomize的規則會導致RAII類型'locks'被允許編譯出來... – IdeaHat 2014-10-03 18:49:46

+1

該標準禁止在構造函數非常重要時優化掉本地對象,即改變程序的效果。但*任何*可以在as-if規則下優化。這意味着你有一個有保證的效果,或者缺乏效果,並且就效率而言,你只需** MEASURE **。 – 2014-10-03 18:50:51

+2

你是什麼意思標題中的「標籤分派對象」。這與你的例子有什麼關係嗎?另外,你的措辭「從來沒有實際使用過」表明有些東西可能被誤解爲使用,但你的例子並沒有顯示出這種情況,它是什麼。 – 2014-10-03 18:53:11

回答

2

我會無論在什麼標準說和 編譯器實際上做什麼感興趣。

只要可觀察行爲保持不變,就允許編譯器執行任意更改。這就是所謂的as-if rule

當且僅當MyHeavyObject的默認構造函數沒有副作用而改變程序的可觀察行爲時,參數和臨時值可能會被優化。

有時很難讓編譯器發現 - 它可能優化無副作用的代碼,它不得,這取決於它決定分析多遠,以及如何複雜的代碼實際上是。
我希望Clang和GCC都能正確優化上面的代碼(假設MyHeavyObject的默認構造函數非常簡單),但我會測試它是否可以。