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

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

 2008-08-09 19:26:08 来源:WEB开发网   
核心提示: 再看接下来的代码//ForceCalcResult_non_inline(r2);pushedicallForceCalcResult (401000h)结果确实是存放在edi中的,我们接着看普通“循环”版本://int r1 = dot_product(dim,v

再看接下来的代码

//ForceCalcResult_non_inline(r2);
push    edi
call    ForceCalcResult (401000h)
结果确实是存放在edi中的。

我们接着看普通“循环”版本://int r1 = dot_product(dim,v1,v2);
mov    esi,dword ptr [esp+10h]
mov    eax,dword ptr [esp+14h]
imul    esi,dword ptr [esp+1Ch]
imul    eax,dword ptr [esp+20h]
// esi = v2[1]*v1[1]
// eax = v2[2]*v1[2]
mov    ecx,dword ptr [esp+0Ch]
imul    ecx,dword ptr [esp+18h]
// ecx = v2[0]*v1[0]
add    esi,eax
add    esi,ecx
// esi = esi+eax+ecx = v2[1]*v1[1] + v2[2]*v1[2] + v2[0]*v1[0]
//ForceCalcResult_non_inline(r1);
push    esi 
call    ForceCalcResult (401000h)

几乎相同的代码,使用的是esi,ecx,eax,结果保存在esi中。

循环同样被解开了!

编译器在我们的重重算计下,被迫在运行时计算结果,同时将运算方法展现出来;但同时,它依然不屈不饶的向我们展示它的强大优化能力!

(详细代码见sample2)

验证2+:

在验证2中,编译器知道了 const int dim = 3; 这一上下文。从而将普通循环版本的点积函数进行展开。

让我们来看看,dim取更大值时,编译器会如何。

dim=10:

普通“循环”点积计算被展开,使用esi,eax,ecx,edx,10条mov与imul指令,9条add指令,最终将计算结果存入esi

模板元点击计算也被展开,使用edi,eax,ecx,edx,10条mov与imul指令,9条add指令,最终将计算结果存入edi

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

Tags:利用 模板 编程

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