2011-06-26 94 views
10

在有人跳躍並說Profile before optimize!之前,這只是一個好奇心問題,起源於this original questionC++編譯器會通過`reference`優化掉未使用的返回值嗎?

如果我通過引用返回相同的對象,如果不使用它會得到優化嗎?例如,我有一個Vector<>有各種數學函數(假設我沒有使用運算符重載)。兩種方式書寫它的:

inline void Vector::Add(const Vector& in) // Adds incoming vector to this vector 

OR

inline Vector& Vector::Add(const Vector& in) // Adds incoming vector to this vector and returns a reference to this vector 

現在,如果Add()是不使用返回值時,將編譯器只是乾脆扔掉迴歸和功能隨着它有沒有返回值開始?如果它不是inlined

回答

11

作爲參數或返回語句的引用通常以類似於指針的方式實現,並且成本是最小的(在大多數情況下可忽略不計)。根據調用約定,它可以是註冊表中的單個商店。

至於是否可以優化返回,除非編譯器內聯代碼否,否則不能。當編譯器處理函數時,它不知道調用代碼是否使用return語句,這又意味着它必須總是返回的東西。

+0

+1,還有一個不錯的答案,正如往常一樣:) –

+2

這假設編譯器會處理一次函數,而不是在每次調用函數時處理函數。許多現代編譯器都可以(或可以配置這樣做)後者。他們這樣做的原因之一就是準確地進行這種優化。 –

+0

「除非編譯器內嵌代碼否」 - 意思是'現在,使用LTO,所有非共享對象代碼都可以內聯,所以可能是':-) –

4

如果函數未內聯,則返回值必須存儲在某處,可能是CPU寄存器。這可能只需要一個寄存器副本。在大多數情況下,如果開銷超過單個CPU週期,我會感到驚訝。