编译器一些优化的概念
常量折叠: 计算公式中出现多个常量进行计算时并且编译器可以在编译期间可以进行计算的,这样源码中机会把结果的常量值进行替换
常量传播:指的是在编译期间可以计算出结果的变量转换为常量值
优化方式采用的是窥孔优化方法:百度定义:是一种很局部的优化方式,编译器仅仅在一个基本块或者多个基本块中,针对已经生成的代码,结合CPUs自己指令的特点,通过一些认为可能带来性能提升的转换规则
举个例子:比如你变量+常量的代码发生了常量传播优化,也就是变成了常量+常量,这时候检查是否还能优化,变成常量折叠
优化大部分在Release版本下才会优化. 但是Debug版本也会优化,在不影响用户调试的前提下进行优化
加法
Release版
1常量加常量
printf("10+5=%d\n", 10 + 5);
2变量加常量
注意,如果变量是像argc或者scanf函数那种在运行期间确定值的变量,是优化不了的,因为这在编译期间计算不了,不确定
int nVal1 = 0x10;
printf("%d", nVal1 + 5);
3变量加变量
int nVal1 = 0x10;
int nVal2 = 0x20;
printf("%d", nVal1 + nVal2);
Debug版
1常量加常量
printf("10+5=%d\n", 10 + 5);
2变量加常量
int nVal = 0x10;
printf("%d", nVal1 + 5);
3变量加变量
int nVal1 = 0x10;
int nVal2 = 0x20;
printf("%d", nVal1 + nVal2);
减法
Release版
1常量减常量
printf("10-5=%d\n", 10 - 5);
2变量减常量
int nVal1 = 0x10;
printf("%d", nVal1 - 5);
3变量减变量
int nVal1 = 0x20;
int nVal2 = 0x10;
printf("%d", nVal1 - nVal2);
Debug版
1常量减常量
printf("10-5=%d\n", 10 - 5);
2变量减常量
int nVal1 = 0x10;
printf("%d", nVal1 - 5);
3变量减变量
int nVal1 = 0x20;
int nVal2 = 0x10;
printf("%d", nVal1 - nVal2);
乘法
带幂优化概念 : 带幂优化则是我在算乘法的时候, 我可以左移几位, 最终取得我们要的结果,这样优化是为了减少指令周期,增加程序执行效率,当然乘法不是只有这一种优化,我写这个只是为了让自己了解什么叫带幂优化概念,优化方案肯定有好几种的,比如上面写的常量折叠也是,具体优化方案看编译器
Release版
//不带2的幂
//常量乘常量
printf("%d\n", 5 * 5);
//变量量乘常量
int n1 = 10;
int n2 = 5;
printf("%d\n", n1*7);
//变量量乘变量
printf("%d\n", n1*n2);
//带幂
//常量乘常量
printf("%d\n", 5 * 4);
//变量量乘常量
printf("%d\n", n1 * 4);
//变量量乘变量
int n3 = 4;
printf("%d\n", n1*n3);
Debug版
//不带2的幂
//常量乘常量
printf("%d\n", 5 * 5);
//变量量乘常量
int n1 = 10;
int n2 = 5;
printf("%d\n", n1 * 7);
//变量量乘变量
printf("%d\n", n1*n2);
//带幂
//常量乘常量
printf("%d\n", 5 * 4);
//变量量乘常量
printf("%d\n", n1 * 4);
//变量乘变量
int n3 = 4;
printf("%d\n", n1*n3);