编译器优化的局限性

编译器运用复杂的算法来确定一个程序中计算的是什么值,以及它们是如何被使用的,然后它们会利用通过一些方法来简化表达式,也就是在几个不同的地方使用一个计算,以降低一个给定计算必须执行的次数


编译器的优化能力受以下因素限制:
1 无论编译器如何优化,编译器绝不能改变程序的最后结果
2 它们对程序的行为、对使用它们的环境了解有限
3 编译器需要快速的完成编译操作
编译器的优化工作对用户来说是不可见的。当程序员用优化选项时(-O)是生成的程序和不加入优化选项生成的程序,最终的运行结果应该都是一致,除了加入优化选项产生的程序运行速度会快一些。


例:

   //函数sum
   void sum(int *a,int *b)
    {
    *a += *b;
    *a += *b;
    }

   //函数 sum1
   void sum1(int *a,int *b)
   {
    *a = 2* *b;
   }
 

//我们发现这函数 sum 和 sum1 具有相同的程序行为,两个函数的功能都是将指针a的值由两个b的值叠加,
但是我们通过测试,我们会发现sum1函数具有更高的效率,它只需要进行三次存储器的引用就可以得到结果(读a 读 b 写 a)

而sum函数需要进行六次的读写操作(两次读a 两次读b 两次写a)


总结:

从上面的代码,我们可以看出,编译器不会进行优化将sum优化为sum1,这就情况就是我们常见的编译器的优化的局限性,这种情况就需要我们自己在程序中注意程序的写法,能编译器能够产生更高效的代码。