1、消除循环 - 顾名思义 尽量减少循环的存在
2、函数代码就地扩展 - 扩展函数花费时间相对复杂功能的函数扩展使用的时间来说微不足道,但是一个很简单只有几行的函数每次调用都需要扩展那么所消耗的资源和时间就比较大了,这时可以用内联函数,当编译器编译内联函数时,内联函数内容会替换函数调用,以保证在调用时避免函数调用的开销。
3、公共子表达式消除 - 编译器优化项,示例如下,想来这也是volatile存在的意义吧
int main()
{
int a = 2,b=3,c=4;
int E = a*b*c;//调用到这里时a b c三个变量进行运算
int F = a*b*c;//调用到这里时检查a b c三个值是否发生变化,如果没变化则将之前计算好的值赋给F
}
4、改进寄存器分配 - 编译器优化项
5、省略运行时对数组边界的检查 - 编译器优化项,有的编译器可提供是否省略运行时对数组边界进行检查,当然函数API如果接收参数有数组,不考虑健壮性的情况下也可以考虑省略数组的边界检查。
6、循环不变量代码移动 - 目前有些编译器是可以自动优化的,但某些代码因为特殊原因检查不到,所以做不了优化。实例如下
//优化前
int test_fun(int *num,int a[],int b[])
{
int i;
for(i = 0;i < 10;i++)
{
*num +=a[i]*b[i];//运行时*num总要访问内存 取到num地址指向的值
}
return 0;
}
//优化后
int test_fun(int *num,int a[],int b[])
{
int i,test_num = 0;
for(i = 0;i < 10;i++)
{
test_num +=a[i]*b[i];//使用一个int变量有效避免了每次都要取地址值的情况
}
*num = test_num;
return 0;
}
7、操作符长度消减 - 把指数操作转变为乘法操作,把乘法操作转变为移位操作或加法操作等,示例如下
//指数操作一般都用row c库函数,简单方便,这里介绍下2倍数的乘法操作
int main()
{
int a = 2,b = 2,m = 0,n = 0;
m = a * 2;
n = a << 1;
printf("m=(%d) n=(%d)",m,n);
return 0;
}
结果:m=(4) n=(4)