C++中有沒有一種方法可以聲明函數沒有副作用?考慮:C++:優化函數,無副作用
LOG("message").SetCategory(GetCategory());
現在假設在釋放LOG宏構建創建具有SetCategory定義爲空功能的NullLogEntry對象()。所以基本上整個表達式可以(也應該)被優化掉 - 理論上說,GetCategory()調用可能有一些副作用,所以我猜編譯器不允許把它扔掉。
另一個例子可能是其參數的函數模板特殊化忽略部分(或全部),但是編譯器是不允許保存這些論點的評價在調用點,由於可能的副作用。
我對不對?或者編譯器是否可以優化掉這些調用呢?如果沒有,有沒有辦法暗示編譯器這個函數沒有副作用,所以如果忽略返回值,那麼整個調用可以被跳過?
只要函數足夠小就可以內聯,所有代碼都被優化掉的機率非常好。顯然這是一個實現細節,你必須自己驗證。 –
基本上,編譯器不允許在優化時進行任何*語義*更改。刪除函數調用是一種語義變化。既然你不能明確地告訴編譯器「這個函數沒有副作用」,它不會被優化。 –
@Cicada:一些C++編譯器定義了一些屬性(比如'pure'),讓你告訴編譯器該函數沒有副作用,因此理論上它可以緩存結果/優化它的調用。 –