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

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

 2008-08-09 19:26:08 来源:WEB开发网   
核心提示: 比较合理的解释是,编译器知道了太多的上下文,利用模板元编程实现解循环优化(5),做出了足够的优化,将本来应该运行时得出的结果—— 一个不变的结果 ——放入的可执行文件中, 编译器会将r2的计算,推迟到 cout<<r2<&l

比较合理的解释是,编译器知道了太多的上下文,做出了足够的优化,将本来应该运行时得出的结果—— 一个不变的结果 ——放入的可执行文件中,直接输出。

为了验证模板元解循环技术,我们要另外想办法。

验证2:

我们需要“阻挠”编译器,让它不能猜测出运行结果,从而生成真正的计算代码。

这里使用了一个比较简单的方案:

template<class OutIt>
void __stdcall MyGenerate(OutIt first,OutIt last,const char *name) {
  cout<<"generating "<<name<<" with clock
";
  generate(first,last,clock);
  ostream_iterator<int> oit(cout," ");
  copy(first,last,oit);
  cout<<endl;
}

用clock 函数返回值填充一个序列,即使编译器“胆大包天”,也不敢猜测clock返回结果了~

多余的 name 参数和一些输出语句是因为在release模式下,watch窗口中看不到值。

而__stdcall 是让 MyGenerate后不生成多余的平衡堆栈代码。

按照如下方式使用 :

MyGenerate(v1,v1+3,”v1”);
MyGenerate(v2,v2+3,”v2”);
int r1 = dot_product(3,v1,v2);
MyGenerate(v1,v1+3,”v1”);
MyGenerate(v2,v2+3,”v2”);
int r2 = dot_product<3>(v1,v2);
cout<<r1<<endl;
cout<<r2<<endl;

仍然不够, 编译器会将r2的计算,推迟到 cout<<r2<<endl;中,使得r2的计算不够清晰。

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

Tags:利用 模板 编程

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