- 论坛徽章:
- 0
|
10可用积分
本帖最后由 donet8 于 2012-05-24 09:26 编辑
我用VC10写了几行小程序,编译release版
- int main(void){
- int i=0;
- for(int c=0;c<11;++c){//循环11次,因为10次以下循环本身会被优化掉。
- i+=c;
- }
- printf("%d\n",i);
- return 0;
- }
复制代码 发现for循环反汇编代码是这样的:
- for(int c=0;c<11;++c){
- 0040101E cmp eax,0Bh
- 00401021 jge main+25h (401025h)
- i+=c;
- 00401023 mov esi,eax
- 00401025 add ecx,edx
- 00401027 add ecx,esi
- }
复制代码 然后我修改一下循环的次数从11改成12,发现生成的反汇编代码变复杂了:
- for(int c=0;c<12;++c){
- 00401004 xor eax,eax
- 00401006 xor esi,esi
- 00401008 xor edx,edx
- 0040100A xor ecx,ecx
- 0040100C lea esp,[esp]
- i+=c;
- 00401010 add edi,eax
- 00401012 lea ecx,[ecx+eax+1]
- 00401016 lea edx,[edx+eax+2]
- 0040101A lea esi,[esi+eax+3]
- 0040101E add eax,4
- 00401021 cmp eax,0Ch
- 00401024 jl main+10h (401010h)
- }
复制代码 现在i+=c这条语句的代码怎么变得这么复杂? 这是什么样的优化技术么?
我发现c=16的时候,代码和c=12是一样的。
并且,c=13的时候,代码和c=11是一样的。
而c=15的时候,生成的代码又是另一种:
- for(int c=0;c<15;++c){
- 00401003 xor eax,eax
- 00401005 xor edx,edx
- 00401007 xor ecx,ecx
- 00401009 lea esp,[esp]
- i+=c;
- 00401010 add esi,eax
- 00401012 lea ecx,[ecx+eax+1]
- 00401016 lea edx,[edx+eax+2]
- 0040101A add eax,3
- 0040101D cmp eax,0Fh
- 00401020 jl main+10h (401010h)
- }
复制代码 这到底是怎么一回事? 我猜想是编译器的某种优化技术,但是不知道具体是什么技术。
各位高人能解释一下么? |
最佳答案
查看完整内容
我也没仔细看汇编,不过:0040101E add eax,4 00401021 cmp eax,0Ch 0Ch不就是12么,每次加4,循环3次在循环次数15的时候:0040101A add eax,3 0040101D cmp eax,0Fh0Fh不就是15么,每次加3,循环5次
|