利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网前4条指令执行后:
堆栈应该是:
std::endl
20h
ECX 保存的是 std::cout
std::cout 的类型是std::basic_ostream<char,std::char_traits<char> >
所以第5条指令正是对cout的成员函数“ opeator<<”进行调用
(this指针 std::cout,已经存入ECX,而且可以猜想这个成员函数正是 operator(int) 重载)
而参数,对的,是call指令前,堆栈栈顶“20h”—— 32的16进制。
第5条指令将执行 cout.operator<<(20h); !
让我们把 r1被编译器偷偷替换成20h的事放在一边,继续解析后2条指令:
cout.operator<< 使用__thiscall调用约定,函数自己弹出堆栈中参数20h, 返回自身引用,返回值存入EAX。
所以第5条指令执行后:
堆栈应该是:
std::endl;
EAX 保存的是返回值,即是std::cout
第6条指令 mov ecx,eax 将返回值重新放入ECX,设置好this指针。
第7条指令 继续调用 operator<< 的另一个重载版本。(这时 std::endl 在栈顶)
完成语句 cout.operator<<(endl);
cout<<r2<<endl; 生成了相似的7条指令。
这个原本就短小的程序,被编译器“篡改”为更短小的程序:
int main() {
如果改用 printf 输出:
cout<<32<<endl;cout<<32<<endl;
return 0;
}printf(“%d
从反汇编可以更清楚的看出,编译器实际做出的代码是:
”,r1); printf(“%d
”,r2);printf(“%d
”,0x20); printf(“%d
”,0x20);
(详细代码见 sample1)
更多精彩
赞助商链接