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)

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

C语言 之编译器优化相关推荐

  1. 干货:嵌入式C语言源代码优化方案(非编译器优化)

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中 ...

  2. C语言 使用数组索引与指针索引 在循环中对编译器优化的影响及耗时分析

    C语言在访问数组时既可以使用如a[i]这样的下标方式,也可以使用*(a+i)这样的指针方式,理论上完全等价.但是在编译器对循环作优化时,对于指针方式的索引很有可能分析不彻底,因此相比数组索引耗时有所增 ...

  3. c语言编译器 代码优化,c编译器高级篇!!搞定c编译器优化

    对于c编译器,想必大家也有所了解,3款主流c编译器也是活跃在不同人群的PC上.网络上很多文章都止步于对c编译器的介绍,并未探索c编译器更加深层次的内容.而在本文中,将涉及c编译器的高级部分--c编译器 ...

  4. Rust和C / C ++的跨语言链接时间优化LTO

    Rust和C / C ++的跨语言链接时间优化LTO 链接时间优化(LTO)是LLVM实施整个程序优化的方法.跨语言LTO是Rust编译器中的一项新功能,使LLVM的链接时间优化可以在混合的C / C ...

  5. 【转】C 编译器优化过程中的 Bug

    C 编译器优化过程中的 Bug 一个朋友向我指出一个最近他们发现的 GCC 编译器优化过程(加上 -O3 选项)里的 bug,导致他们的产品出现非常诡异的行为.这使我想起以前见过的一个 GCC bug ...

  6. 深入理解JVM虚拟机(八):编译器优化

    本博客从编译期源码实现的层次上让我们了解了Java源代码编译为字节码的过程,分析了Java语言中泛型.主动装箱/拆箱.条件编译等多种语法糖的前因后果. 1. 概述 java语言的"编译期&q ...

  7. Java编译器优化与运行期优化技术浅析

    2019独角兽企业重金招聘Python工程师标准>>> 一.java编译器优化 1. JVM的编译器可以分为三个编译器:      1)  前端编译器:把.java转变为.class ...

  8. LWN:怕不怕编译器优化让你的代码彻底乱套?

    Who's afraid of a big bad optimizing compiler? July 15, 2019 (Many contributors) 本文贡献者包括Jade Alglave ...

  9. 编译器优化故障的测试与定位

    作者 | 江贺 整理 | Hana 作者简介: 江贺,大连理工大学软件学院教授,博士生导师,研究领域:智能软件工程(软件大数据处理.编译系统测试.工业软件测试) 个人主页:http://faculty ...

最新文章

  1. struct stat结构体的详解和用法
  2. python可变序列和不可变序列_一文看懂可变序列和不可变序列
  3. python结束不退出_Python 基本功: 1. Hello world
  4. 无人驾驶系列】光学雷达(LiDAR)在无人驾驶技术中的应用
  5. webpack从入门到精通(一)初体验
  6. xdm,把我大学四年能用到的软件都分享给你。
  7. 还不明白可空类型原理? 我可要挖到底了
  8. Spring中DispacherServlet、WebApplicationContext、ServletContext的关系
  9. 围观:各地大学教师自曝近年工资待遇,真实一手数据!
  10. 芒果超媒:子公司与咪咕文化签署合作框架协议
  11. 分布式文件系统(FastDFS+Tengine+fastdfs-nginx-module)
  12. wps文档怎么画流程图6_wps文字如何绘制流程图图文教程
  13. windows下的DataX的安装和使用教程
  14. 十、基于FPGA的PCIE协议介绍(二)
  15. 工业互联网(十三)——工业相机相关知识(初学者必备)
  16. 私活必备11个免费后台管理系统模板
  17. 鸭子应用--策略模式
  18. 数据分析 第六讲 pandas
  19. Windwos注册表案例(友尽百科)
  20. 电力电子转战数字IC——我的IC笔试(2022.10.14更新)

热门文章

  1. 取各位数字c语言程序,取出数字的每一位
  2. Angular教程:英雄之旅-显示英雄列表-运行结果
  3. android版cmd命令,android开发中的cmd命令
  4. Java 中引用类型都有哪些
  5. c语言(int*p),浅析int*p[ ]与int(*p)[ ]的区别
  6. 电脑双击EASYBCD无法打开
  7. php fsockopen 443,在PHP中通过特定端口(fsockopen)ping服务器
  8. Cocoa利用TexturePacker创建的纹理图集实现角色的帧动画
  9. Python实现动态规划Labeling算法求解SPPRC问题
  10. 美国藤校Top30大学对IB成绩的要求