C语言 之编译器优化

 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)

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

 
发布了174 篇原创文章 · 获赞 394 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/tiao_god/article/details/52291065