现代编译器使用精妙的算法去确定哪些变量需要去计算以及这些变量的怎么去使用, 这样就可以去简化表达式,减少某个计算任务所需要的时间。
大部分的编译器,包括GCC,会给程序员一些接口去控制优化的程度,比如 GCC -O1 ,就是给程序一些基本的优化,当带上的参数为 O2, O3的时候,就会给程序更深层次的优化,它们在增强程序性能的同时,也可能会增加程序的大小以及将来debug的难度。
编译器所做的优化,必须是“安全”的,就是说,优化前与优化后对任何可能情形的处理有着完全相同的行为。受到编译器“安全”优化的限制,我们程序员要写出更利于编译器去优化的代码。 为了领会这个说法,下面举个例子,思考下面,两个procedure
1 void twiddle1(int *xp, int *yp)
2 {
3 *xp += *yp;
4 *xp += *yp;
5 }
6 void twiddle2(int *xp, int *yp)
7 {
8 *xp += 2 * *yp;
9 }
第一眼看过去,这两个函数做的事情完全一样,都将yp的值取两次加到xp指向的位置,另一方面函数widdle2 运行起来,会更高效一些。它只需要三次引用(读或者写)内存,(读*xp, 读*yp, 写*xp). 但是 twiddle1 需要6次引用内存(两次读*xp, 两次读*yp, 两次写*xp).
所以,如果