利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网比较合理的解释是,编译器知道了太多的上下文,做出了足够的优化,将本来应该运行时得出的结果—— 一个不变的结果 ——放入的可执行文件中,直接输出。
为了验证模板元解循环技术,我们要另外想办法。
验证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的计算不够清晰。
赞助商链接