冗余标签消除

· Redundant branch elimination

冗余分支清除,所以可能出现由于对变量和分支的共同优化,导致某些条件分支明明成立却始终不会进入,一个大坑。

· Code hoisting

代码提升,很难理解的名字,其实就是它字面意思,就是把某些代码(变量定义)提到作用域的顶部去,可笑的是定义的顺序不变。也就是说,你定义了全局变量a=1,然后在某个函数里输出a,在下面定义局部变量a=2,最后输出的结果是乱码或者0,这取决于局部变量的默认初始化的值。在函数里真正被输出的,不是全局变量的a,而是局部变量的a,但是这个a只做了定义,初始化还在原位置。

· Peephole optimization

窥孔优化,通俗点说是局部优化,编译器对部分编译的代码,结合目标CPU的指令特点,做一些认为可以提高性能的优化。

· Some register content analysis and optimization

寄存器内容分析与优化

· Static clustering

静态聚类。将在同一模块内定义的静态变量和全局变量布置成使得在相同函数中访问的变量彼此紧密地存储。这使得编译器可以为多个访问使用相同的基指针。

· Common subexpression elimination

公共子表达式消去,在编程中会有很多地方使用相似的表达式,比如:

a=b+c+d;

e=b+c+f;

这个时候可以优化成这样:

tem=b+c;

a=tem+d;

e=tem+f;

4.High

最高程度的优化。具备以上所有的优化之外,还有:

· Instruction scheduling

指令调度,编译器根据自己的指令调度器去重新安排指令,使得处理器运行时出现的资源冲突情况更少,从而减少资源冲突引起的卡顿情况。

· Cross jumping

交叉跳跃

· Advanced register content analysis and optimization

高级寄存器内容分析与优化

· Loop unrolling

循环展开。有一些小的循环体,在编译时就能确定其循环次数,编译器会启发式得试探是否将这个循环体复制展开,展开循环体能减少程序的迭代次数,从而加快程序的运行速度,但会增加代码的大小。

编译器会从速度和代码大小之间去找一个平衡点,优化速度和优化代码大小那个配置就会影响这个优化。

· Function inlining

函数内联

如果一个比较小的函数在编译时已经能确定其准确的定义了,编译器会决定将其内联到调用者的内部,这样就会减小函数调用的开销。

· Code motion

代码移动。对循环不变的表达式和公共子表达式进行移动,避免其被再次评估。这个优化会减小程序代码体积,加快执行速度。

· Type-based alias analysis

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查