我正在運行一組比較不同libc字符串函數的基準測試。問題是GCC和Clang正在優化循環中的計算,因爲函數被標記爲「純」和「常量」。有什麼方法可以關閉優化或避開它?GCC和Clang:關閉純優化
回答
我解決了!該解決方案是討厭的,但它的工作原理:
volatile int x;
for (...)
{
// ...
x = (int)f(args);
}
我從來沒有使用x的值,所以劇組將不會是一個問題。更好的是,現在我沒有得到關於不使用return value of function declared with pure attribute
的錯誤。
解決方案中沒有任何內容阻止編譯器的下一個版本或當前版本將該循環轉換爲'int i =(int)f(args);對於(...)x = i;' –
@PascalCuoq:我聲明'x'爲['volatile'](http://en.wikipedia.org/wiki/Volatile_variable),所以編譯器知道它不應該'不要碰。 – refi64
您將'x'聲明爲'volatile',因此編譯器知道在目標代碼中應該有與源代碼一樣多的訪問權限。 'volatile'限定符不適用於'(int)f(args)',所以編譯器可以將它從循環中提取出來。這是一個經典的優化,如果至少有一個編譯器能夠將它應用到您的代碼中,我不會感到驚訝。不這樣做的編譯器根本沒有實現與純函數相關的全部優化範圍。 「 –
- 1. 如何關閉Clang ++中的_all_優化?
- 2. GCC和Clang優化選項之間的區別
- 3. 的Xcode 3.2.1 GCC CLANG和LLVM神祕化
- 4. GCC:關於GCC「優化」和「內聯」的定義問題
- 5. malloc和gcc優化2
- 6. OSX 10.10。優勝美地Clang&GCC版本
- 7. 無法關閉gcc優化器,automake中的Makefile
- 8. 如何關閉GCC中的所有優化
- 9. 關閉gcc中特定功能的優化4.2.2
- 10. 如何關閉gcc中的特定優化標誌
- 11. GCC printf優化
- 12. LLVM和Clang中的優化級別
- 13. LLVM,CLang和LLC優化傳遞
- 14. 谷歌關閉優化
- 15. Clang優化破解代碼?
- 16. GCC堆棧優化
- 17. GCC優化標誌
- 18. GCC優化選項
- 19. GCC優化步驟
- 20. 關於GCC編譯x86_64的代碼和C代碼優化
- 21. GNU GCC編譯器優化和調試
- 22. gcc優化前增量和後增量
- 23. gcc優化:-O0做什麼?
- 24. GCC手工採摘優化
- 25. GCC寄存器優化
- 26. gcc的優化的說明
- 27. 「壞」GCC優化性能
- 28. GCC多個優化標記
- 29. GCC SSE代碼優化
- 30. 瞭解gcc的優化
clang讓你選擇執行哪些通道,用gcc我不太確定 –
基準測試這些東西的最好方法是使用結果。從輸出中打印出一個單獨的數字通常就足夠了。 – Mysticial
使用純/常量函數,您希望使用結果,但您也希望確保每次都使用不同的參數調用它們,否則編譯器可能會執行一次調用。禁用編譯器傳遞(@Marco當然是gcc允許它)太脆弱了(除非你用-O0)。您可以嘗試自己聲明這些libc函數(而不是包含標準頭文件)並使用-fno-builtin編譯,因此編譯器不知道函數是純/常量,但更好地遵循Mysticial的建議。 –