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)
优化有好处也有坏处,总之要谨慎使用。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。