一丶编译器优化方式
首先说一下编译器优化方式.
1.常量折叠
2.常量传播
3.复写传播
4.公共表达式
5.去掉不可达到分支
6.顺序代替分支
7.数学变化
8.代码外提
9.减少变量.
10 强度削弱.
优化方式解析
1.常量折叠
常量折叠已经讲过, 就是两个常量相加 8 + 8 ,那么在编译前期就能计算出来.
2.常量传播
当一个变量,没有对齐进行写入或者更改的时候,这个时候可以当做常量.(优化为常量)
3.复写传播
这个需要好好说说了,我们都知道,C语言中,C调用约定都需要平栈.比如你调用完毕一个printf,那么就需要平栈.
而优化的时候,直接一起平栈了.
就比如:
int i = (a * a + b);
int j = i * 5;
那么此时可以变成 int j = (a * a + b) * 5 ;这样就会省掉一个变量(当然和去除变量不一样)
call addr
add esp,8
call addr
add esp,8
此时汇编代码可以变成
call addr
call addr
add esp,16 这样就省掉了一个add 指令了.
4.公共表达式
公共表达式和复写传播有点不一样.(看着是相反的.但是不能说是相反的.)
比如 int i = (a *a * b) * 7;
int j = (a * a * b) * 7 * 3
优化之后变成.
int j = i * 3;
什么是公共表达式,就是说,表达式用的都是一样的.重复使用,这样的时候,可以使用变量来存着了.或者中专一个寄存器保存其结果.
这样效率会很快,不用重新计算了.
5.去掉不可达到分支
这个应该很好理解.
if(1) { ...... } else { ..... }
此时if语句会成立,而else永远不会成立,那么编译器优化的时候就可以去掉else语句了.
6.顺序代替分支
这个下方讲解三木运算符的时候可以明白.
7.数学变化
这也很好理解.
3a + 5a
那么此时可以变为一条表达式计算直接变成8a