编译器的工作过程中可以分为几个阶段:预处理-》词法分析-》语法分析-》语义分析-》中间代码生成-》目标代码生成。其中,优化的机会一般存在于中间代码生成或目标代码生成这两个阶段。尤其是在中间代码生成阶段所做的优化,这类优化不具备设备相关性,在不同的硬件环境中都能通用。debug下, ...
编译器的工作过程中可以分为几个阶段:预处理-》词法分析-》语法分析-》语义分析-》中间代码生成-》目标代码生成。其中,优化的机会一般存在于中间代码生成或目标代码生成这两个阶段。尤其是在中间代码生成阶段所做的优化,这类优化不具备设备相关性,在不同的硬件环境中都能通用。
debug下,为了调试方便,保持原码与反汇编代码的一一对应,只是进行了很少的优化。
常见的与设备无关的优化方案有以下几种:
1、常量折叠2、常量传播3、减少变量4、剪支优化5、公共表达式6、复写传播7、顺序语句代替分支8、强度削弱9、数学变换10、代码外提
第一格是C++原码,第二格是debug下反汇编代码,第三格是release反汇编下代码,重点看。
代码中的所有输入输出句都是为了防止变量被优化掉,没有其他意义。
#include <iostream>using namespace std;int main(){//=======================================常量折叠与常量传播 int a1; a1 = 1 + 1; cout << a1 << endl;//=======================================减少变量 int x1, y1, m1, n1; cin >> m1 >> n1; x1 = m1 * 2; y1 = n1 * 2; if (x1 > y1) cout <<"TRUE"<< endl;//=======================================公共表达式 int x2, y2, m2; cin >> m2 ; x2 = m2 * 2; y2 = m2 * 2; cout << x2 << y2 << endl; cin >> x2 >> y2;//=======================================复写传播 int x3, y3, a,c; cin >> a>>c; x3 = a; y3 = x3 + c; cout << x3 << y3 << endl; cin >> x3 >> y3;//=======================================剪去不可达分支(剪支优化) if (1 > 2) cout << "TRUE" << endl;//=======================================顺序语句代替分支 int a2; cin >> a2; a2 == 5 ?a2= 6 :a2= 7; cout << a2<< endl;//=======================================强度削弱 int x4, y4, a3; cin >> a3 ; x4 = a3*2; y4 = a3 / 4; cout << x4 << y4;//=======================================数学变换 int x5, y5, a4, b4; cin >> a4 >> b4; x5 = a4 * 1; y5 = a4*x5 + b4*x5; cout << x5 << y5 << endl;//=======================================代码外提 int x6, y6; cin >> x6 >> y6; while (x6 < y6 / 2) { cout << x6 << endl; x6++; }//=============================================== system("pause"); return 0;}
原标题:C++反汇编笔记(五)编译器(VS2013)常用的几个优化技巧(1)
关键词:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。
|