利用模板元编程实现解循环优化
2008-08-09 19:26:08 来源:WEB开发网dim=11:
循环点积计算发生了变化,代码如下:
//MyGenerate(v1,v1+dim,"v1");
00401017 mov eax,offset string "v1" (402134h)
0040101C lea edi,[esp+68h]
00401020 lea ebx,[esp+3Ch]
00401024 call MyGenerate<int *> (401280h)
//MyGenerate(v2,v2+dim,"v2");
00401029 mov eax,offset string "v2" (402138h)
0040102E lea edi,[esp+3Ch]
00401032 lea ebx,[esp+10h]
00401036 call MyGenerate<int *> (401280h)
// v1[0]:esp+3Ch, v2[0]:esp+10h
//int r1 = dot_product(dim,v1,v2);
0040103B xor ebp,ebp
// int result = ebp=0;
0040103D xor eax,eax
// eax=0;
0040103F nop
// align
// i=eax;
// loops:
00401040 mov ecx,dword ptr [esp+eax+10h]
// ecx = *(v2+i);
00401044 imul ecx,dword ptr [esp+eax+3Ch]
// ecx *= *(v1+i);
00401049 add eax,4
// ++i;
0040104C add ebp,ecx
// result+=ecx
0040104E cmp eax,2Ch
// if (i<11)
00401051 jl main+30h (401040h)
// goto loops;
编译器已经不能“忍受”这样长度的循环展开,将其老老实实的翻译成真正的循环。
但是,编译器仍然对函数做了inline工作。
对于模板元解循环,因为代码要求11层函数调用,编译器能做的只有将11层调用inline,得到的是就地展开的计算。
dim=12:
更多精彩
赞助商链接