2016-09-23 47 views
2

如果有C或C++代碼:編譯器能否優化調用函數以及可能的副作用?

if (func()) 
    ; 

可以編譯器優化了通話的功能func()如果不能確定功能是否有副作用?

我的問題的起源:我有時稱之爲在這樣的方式斷言宏:

if (func()) 
    assert(0); 

如果我想確保func()總是調用和asssertion在調試模式會失敗func()回報錯誤的價值。但最近我被警告說我的代碼不能保證函數總是被調用。

+2

可以發佈'func'的定義嗎? –

+1

爲什麼不'assert(!func())'或' retval = func();斷言(RETVAL!);'? – cxw

+0

這是一種可能產生副作用的常見功能。我不想討論這個具體功能。我們假設這個函數沒有在同一個文件中實現,所以編譯器沒有內部的信息。 – faramir

回答

3

(這是一個C++回答,請張貼問題爲一個編程語言只有,而不是兩個。

沒有,那可能有副作用的功能不能被優化掉了,因爲那麼你可能會「優化」副作用。由於「副作用」我們的意思是「你的程序所做的事情」,允許編譯器做這樣的事情並不會特別有用。這就是爲什麼標準的「假設」規則阻止了你所談論的那種優化。

10

如果編譯器無法證明優化掉func的調用不會改變程序的可觀察行爲,則不允許進行優化。

所以除非編譯器能夠證明不調用函數沒有明顯的效果,否則調用將會發生。請注意,編譯器有時可能很聰明,所以如果你想確定,確保函數實際上的確有有副作用。 (另一方面,如果沒有,你不需要關心。)

這就是所謂的as-if rule

相關問題