利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网再看接下来的代码
//ForceCalcResult_non_inline(r2);
结果确实是存放在edi中的。
push edi
call ForceCalcResult (401000h)
我们接着看普通“循环”版本://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
更多精彩
赞助商链接