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

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

 2008-08-09 19:26:08 来源:WEB开发网   
核心提示: 计算r2的函数,在DotProduct<3,int>::execute 被实例化时就确定了,利用模板元编程实现解循环优化(2),编译器将会实例化int DotProduct<3,int>::execute(const int v1[],const int v2[])

计算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[]) {
  return v1[0]*v2[0] + DotProduct<1,int>::execute(v1+1,v2+1);
}
这里,我们有一个 DotProduct<1,T> 的偏特化版本,计算函数将被实例化为int DotProduct<1,int>::execute(const int v1[],const int v2[]) {
  return v1[0]*v2[0];
}
而这3个函数都足够短小,编译器通常会为它们做inline工作,使得r2的计算被展开为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); 十分相似?

本文以下部分将从编译器生成的机器码层次来验证这一技术,同时与普通循环点积计算做比较。

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

Tags:利用 模板 编程

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