利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网计算r2的函数,在DotProduct<3,int>::execute 被实例化时就确定了。
编译器将会实例化int DotProduct<3,int>::execute(const int v1[],const int v2[]) {
然后编译器继续实例化
return v1[0]*v2[0] + DotProduct<2,int>::execute(v1+1,v2+1);
}int DotProduct<2,int>::execute(const int v1[],const int v2[]) {
这里,我们有一个 DotProduct<1,T> 的偏特化版本,计算函数将被实例化为
return v1[0]*v2[0] + DotProduct<1,int>::execute(v1+1,v2+1);
}int DotProduct<1,int>::execute(const int v1[],const int v2[]) {
而这3个函数都足够短小,编译器通常会为它们做inline工作,使得r2的计算被展开为
return v1[0]*v2[0];
}r2 = v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
DotProduct<3,int>::execute(v1,v2) 的调用语法不是很友好。
书中还设计了一个helper函数。template<int DIM,typename T>
T dot_product(const T v1[],const T v2[]) {
return DotProduct<DIM,T>::execute(v1,v2);
}
如同STL的make_pair、bind2nd,这个模板函数将模板参数T的推导工作交给编译器,使DotProduct的界面更友好,更不容易出错。当然,维度DIM必须指定。
现在可以按如下方式使用 :
int r2 = dot_product<3>(v1,v2); // 是不是和 int r1 = dot_product(3,v1,v2); 十分相似?
本文以下部分将从编译器生成的机器码层次来验证这一技术,同时与普通循环点积计算做比较。
更多精彩
赞助商链接