优化编译器的能力和局限性

影响1: 编译器
///
  1     #include <stdio.h>
  2
  3     void twiddle1(int *xp, int* yp)
  4     {
  5         *xp += *yp;
  6         *xp += *yp;
  7     }
  8     void twiddle2(int* xp, int* yp)
  9     {
 10         *xp += 2* *yp;
 11    }
 12
 13     int main()
 14     {
 15         int a1 = 2,b1 = 2;
 16         int a2 = 2,b2 = 2;
 17         int a3 = 2,b3 = 2;
 18         twiddle1(&a1,&b1);
 19         twiddle2(&a2,&b2);
 20         twiddle1(&a3,&a3);     //两个指针指向相同的地址
 21         twiddle2(&b3,&b3);    //两个指针指向相同的地址
 22         printf("%d %d\n%d %d\n",a1,a2,a3,b3);
 23         return 0;
 24     }
///
打印的结果如下:
6 6
8 6
twiddle2 函数本来是用来优化twiddle1 函数的,twiddle2 函数可以减少寄存器的访问次数,可是当地址相同时却产生了不同的结果,导致优化方案行不通。例如:
x = 1000, y = 3000;
*q = y;
*p = x;
t1 = *q;
此时 t1 的值的确定取决于 p 和 q 的地址是否相同。

//   
1 #include <stdio.h>
  2
  3 void swap(int* xp, int* yp)
  4 {
  5     *xp = *xp + *yp;
  6     *yp = *xp - *yp;
  7     *xp = *xp - *yp;
  8 }
  9 int main()
 10 {
 11     int a = 2;
 12     int b = 2;
 13     int c = 2;
 14     swap(&a,&b);
 15     swap(&c,&c);
 16     printf("a=%d b=%d c=%d\n",a,b,c);
 17     return 0;
 18 }
///
a=2 b=2 c=0
最后 c 的值为0
///

影响2:函数调用
1     #include <stdio.h>
  2     int count = 0;
  3     int fun()
  4     {
  5         return count++;
  6     }
  7
  8     int fun1()
  9     {
 10         return fun()+fun()+fun()+fun();
 11     }
 12     int fun2()
 13     {
 14         return 4*fun();
 15     }
 16     int main()
 17     {
 18         printf("%d\n",fun2());
 19         printf("%d\n",fun1());
 20         return 0;
 21     }
函数的功能是相同的,可是却产生了副作用
0                // 4 * 0
10              // 1 + 2 + 3 = 6 因为先调用了一次fun2()所以count的值变为1,再调用fun2() 《=》 1+2+3+4 = 10;
这是函数调用带来的副作用,而大多数编译器是不会去检查函数有没有副作用的
  以上就是对编译器的优化以及写代码时应该注意的一些细节的介绍,我是参考《深入理解计算机系统》一书,大家如果觉得还不够刺激的话,可以自己去看看这本书,它比较全面的讲解了计算机系统,对我们确实很有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值