可能每个人都使用某种优化开关(在gcc的情况下,最常见的是-O2我相信).
但是gcc(以及VS,Clang等其他编译器)在这些选项的存在下真的做了什么?
当然没有明确的答案,因为它很大程度上取决于平台,编译器版本等.但是,如果可能的话,我想收集一套"经验法则".我什么时候应该考虑加速代码的一些技巧?何时我应该把工作留给编译器?
例如,对于不同的优化级别,编译器会在这样的(一点点artifficial ......)案例中走多远:
1)sin(3.141592)
//是否会在编译时进行评估,还是应该考虑一个查找表来加速计算?
2)int a = 0; a = exp(18), cos(1.57), 2;
//编译器是否会评估exp和cos,尽管不需要,因为表达式的值等于2?
3)
for (size_t i = 0; i < 10; ++i) {
int a = 10 + i;
}
Run Code Online (Sandbox Code Playgroud)
//编译器是否会跳过整个循环,因为它没有可见的副作用?
也许你可以想到其他的例子.