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

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

 2008-08-09 19:26:08 来源:WEB开发网   
核心提示: 所以我们再加入一个函数void ForceCalcResult(int result) { }强制编译器立刻计算点积,同时,利用模板元编程实现解循环优化(6),使用函数指针调用,避免编译器对该函数inline,//MyGenerate(v1,v1+dim,"v1");m

所以我们再加入一个函数

void ForceCalcResult(int result) { }

强制编译器立刻计算点积。

同时,使用函数指针调用,避免编译器对该函数inline。

程序主干如下 :

int main() {
  const int dim = 3;
  int v1[dim];
  int v2[dim];
void ( *const ForceCalcResult_non_inline)(int) = ForceCalcResult;
  MyGenerate(v1,v1+dim,"v1");
  MyGenerate(v2,v2+dim,"v2");
  int r1 = dot_product(dim,v1,v2);
  ForceCalcResult_non_inline(r1);
  MyGenerate(v1,v1+dim,"v1");
  MyGenerate(v2,v2+dim,"v2");
  int r2 = dot_product<dim>(v1,v2);
  ForceCalcResult_non_inline(r2);
  cout<<r1<<endl;
  cout<<r2<<endl;
  return 0;
}
这样,编译器就屈服了,乖乖的把r1和r2的计算代码展现出来。//MyGenerate(v1,v1+dim,"v1");
mov    eax,offset string "v1" (402134h)
lea    edi,[esp+24h]
lea    ebx,[esp+18h]
call    MyGenerate<int *> (401220h)
//MyGenerate(v2,v2+dim,"v2");
mov    eax,offset string "v2" (402138h)
lea    edi,[esp+18h]
lea    ebx,[esp+0Ch]
call    MyGenerate<int *> (401220h)
从这4条指令,我们可以看出v1和v2的地址:v1[0]:esp+18h, v1[1]:esp+1Ch, v1[2]:esp+20h, v1[dim]:esp+24h
v2[0]:esp+0Ch, v2[1]:esp+10h, v2[2]:esp+14h, v2[dim]:esp+18h
让我们先看模板解循环版本://int r2 = dot_product<dim>(v1,v2);
mov    edi,dword ptr [esp+10h]
mov    edx,dword ptr [esp+14h]
imul    edi,dword ptr [esp+1Ch]
imul    edx,dword ptr [esp+20h]
// edi = v2[1]*v1[1]
// edx = v2[2]*v1[2]
mov    eax,dword ptr [esp+0Ch]
imul    eax,dword ptr [esp+18h]
// eax = v2[0]*v1[0]
add    edi,edx
add    edi,eax
// edi = edi+edx+eax = v2[1]*v1[1]+v2[2]*v1[2]+v2[0]*v1[0]

循环被解开了!利用3个寄存器edi,edx,eax,最终结果应该是保存在edi中。

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

Tags:利用 模板 编程

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