我正在运行一组比较不同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的建议。 –