« 任天堂が純金トランプを発売? | トップページ | 無限ループ…ちょっとの違いがデッカイ違いに…?その2 »

2005年12月28日 (水)

無限ループ…ちょっとの違いがデッカイ違いに…?

無限ループで良く見かける方法で「for (;;) 」と「while(TRUE)」とかがある…。

で、隣の人のソースを覗くと…「while(TRUE)」が使われている…。

でも、なぜかマイクロソフトのソースでは、「for (;;) 」を良く見かける…。

二つには、違いが有るのかなぁ~?と以下のソースをコンパイルしてみる…。

void main( void )
{
    int    a = 0;
    for(;;)
    {
        a++;
    }
    while(1)
    {
        a++;
    }
}

コンパイラの結果…。

1:    void main( void )
2:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,44h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
3:        int a = 0;
00401028   mov         dword ptr [ebp-4],0
4:        for(;;)
5:        {
6:            a++;
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,1
00401035   mov         dword ptr [ebp-4],eax
7:        }
00401038   jmp         main+1Fh (0040102f)
8:        while(1)
0040103A   mov         ecx,1
0040103F   test        ecx,ecx
00401041   je          main+3Eh (0040104e)
9:        {
10:           a++;
00401043   mov         edx,dword ptr [ebp-4]
00401046   add         edx,1
00401049   mov         dword ptr [ebp-4],edx
11:       }
0040104C   jmp         main+2Ah (0040103a)
12:   }
0040104E   pop         edi
0040104F   pop         esi
00401050   pop         ebx
00401051   mov         esp,ebp
00401053   pop         ebp
00401054   ret

結論!

「for (;;) 」だとノーチェックの無限ループに対し
「while(TRUE)」だと無駄無意味なチェックが入っていることが分かる。

以下の部分が「while(TRUE)」の意味無しコードだ。
0040103A   mov         ecx,1
0040103F   test        ecx,ecx
00401041   je          main+3Eh (0040104e)

ちょっとの違いだが…無駄な処理は、無い方が良い…。
だって、ループする回数によってペナルティが増えていくんだもん…。
100回ループすれば、X100ペナルティ…。
10000回ならX10000…

と、言う事で、無限ループで「while(TRUE)」を使っているソースをみたら心の中で『クスクス』笑おう…。<性格悪!

ゆえに!「while(1)」と「for(;;)」は違うのだ!

えっへん!

…。

ふと、『最近のコンパイラは、頭が良い!』ともっぱらな噂だが…

リリース版でコンパイルすると…

もしかして結果が違うかも…

と言う事で…

恐る恐る確認…。

1:    void main( void )
2:    {
00401000   jmp         main (00401000)

こんだけ…。

見事な…完璧な…無限ループ。

意味無しコードは、気持ちが良いぐらいスッパリと全て削除…。

侮りがたし、コンパイラ…。

試しに、以下のソースをコンパイルしてみた…

void main( void )
{
    int    a = 0;
    for(;;)
    {
        a++;
        if(a>1000)
            break;
    }
    while(1)
    {
        a++;
        if(a>100000)
            break;
    }
}

結果…

1:    void main( void )
2:    {
00401000   mov         eax,3E9h
3:        int a = 0;
4:        for(;;)
5:        {
6:            a++;
7:            if(a>1000)
8:                break;
9:        }
10:       while(1)
11:       {
12:           a++;
00401005   inc         eax
13:           if(a>100000)
00401006   cmp         eax,186A0h
0040100B   jle         main+5 (00401005)
14:               break;
15:       }
16:   }
0040100D   ret

恐るべし…最適化…。

何も言う事はありません…。

ゴメンナサイ、マイクロソフト様、私が悪うございました…。

この様に最近のコンパイラは、素晴らしいのです!

って、ヨイショする以外無いでしょう的な結果でした…。

タイトルと違うやん!(T_T)

|

« 任天堂が純金トランプを発売? | トップページ | 無限ループ…ちょっとの違いがデッカイ違いに…?その2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/7870613

この記事へのトラックバック一覧です: 無限ループ…ちょっとの違いがデッカイ違いに…?:

« 任天堂が純金トランプを発売? | トップページ | 無限ループ…ちょっとの違いがデッカイ違いに…?その2 »