常量折叠
a=1+2 ;由于结果可预见,编译器直接生成a=3
常量传播
a=1;若后续代码没有更改a,则编译器将a直接用其值1代替
减少变量
/*
对于x和y的比较,可以转换成if(I>j)
/
x=i2;
y=j*2;
if(x>y){
…
}
复写传播
类似于常量长传,不过传播的是变量
/*
若后续代码未修改a的值,则编译器用m代替a
*/
a=m;
b=a+10;
剪枝优化
剔除永远不执行的语句块
流水线优化
代码外提
int CodePick(int nCount){
int nSum=0,nIndex=0;
do{
nSum+=nIndex;
nIndex++;
}while(nIndex<nCount-1);
return nSum;
}
编译器采用代码外提优化,会将nCount-1外提,形如以下代码,避免每次循环都要重复操作。
int CodePick(int nCount){
int nSum=0,nIndex=0;
nCount-=1;
do{
nSum+=nIndex;
nIndex++;
}while(nIndex<nCount);
return nSum;
}
强度削弱
用加法或者左移代替乘法,乘法或者右位移代替除法
int main(int argc,char* argv[]){
int sum=0;
int index=0;
while(sum<argc){
sum=index*99;//这里编译器可能会优化为: sum=index;
index++; // index+=99;
}
printf("%d",sum);
return 0;
}
一次性平衡堆栈
三次调用函数,分别_scanf、_scanf、_printf,由于均是_cdecl调用规则,所以调用完后没有立刻平衡堆栈,而是在最后一次性平衡堆栈。