C语言 之编译器优化

发布时间:2020-06-15 00:03:07 作者:飞寞
来源:网络 阅读:949

  C语言的编译器会对变量和代码进行一定的优化,我们看下面这个例子。

int a,b,c;

a=1;

b=a;

c=b;

  这个程序正常运行的时候会这样子:先把a指向的内存空间内放入1

  再把a指向的内存空间里的数读出来放到b指向的内存空间,

  最后再把b指向的内存空间里的数读出来放到c指向的内存空间里。


然而编译器要对这个程序进行一定的优化,编译的时候,直接把1放入三个内存空间中。

这样子在正常运行的时候确实是好事,但是总会有一些特殊的情况发生,比如,一个中断程序突然改变了a的值,那么会发生这样的情况:本来b和c应该是a改变以后的值,可是编译器优化以后就变成了a,b,c都是1,这就很让人郁闷了。


  那么解决方法是,我们在定义变量的前面加个volatile这个关键字,比如:

volatile int a ;

  这样子以后编译器遇到有a参与的运算的时候就不再给你优化了,这样子可以保证你的程序按照你的预期进行,可是如果你大量使用volatile的话,没有优化,就会降低程序运行的效率。

  本来C语言的运行效率就比汇编低了不少,所以说volatile在加的时候要尽量考虑好,因为很多程序运行的时候特别注重效率。


  第二种优化是restrict关键字,这个关键字只用来修饰指针才有用,修饰不同变量没有任何用处。

当你用restrict修饰的指针不会被别的东西给改变的时候,为了提高执行的效率,就会在编译的时候给你修改。

比如下面这个函数:

int main(void)

{

   int *restrict p1 , *restrict p2 ,a;

   *p1=3;

   *p2=5;

   a=2+(*p2);

   return 0 ;

}

  这样子以后,我们做了优化,编译器在编译的时候就会直接把*p2转换成5(因为后面没有指令能够将其修改,所以直接用5来代替了*p2)

  优化有好处也有坏处,总之要谨慎使用。


推荐阅读:
  1. C语言存储类关键字
  2. C语言中的auto,register,volatile,extern,static,const

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:jQuery操作示例

下一篇:《CRL Via C#》使用CSC.exe对两个文件进行编译

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》