WEB开发网
开发学院软件开发VC 利用模板元编程实现解循环优化 阅读

利用模板元编程实现解循环优化

 2008-08-09 19:26:08 来源:WEB开发网   
核心提示: 前4条指令执行后:堆栈应该是:std::endl20hECX 保存的是 std::coutstd::cout 的类型是std::basic_ostream<char,std::char_traits<char> >所以第5条指令正是对cout的成员函数“

前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() {
  cout<<32<<endl;cout<<32<<endl;
  return 0;
}
如果改用 printf 输出:printf(“%d
”,r1); printf(“%d
”,r2);
从反汇编可以更清楚的看出,编译器实际做出的代码是:printf(“%d
”,0x20); printf(“%d
”,0x20);

(详细代码见 sample1)

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:利用 模板 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接