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)
优化有好处也有坏处,总之要谨慎使用。