- ベストアンサー
計算が終わらないはずなのになぜか終わる?
以下のプログラムをVisual stadio 6.0でコンパイルし プロジェクトの構成をWin32 releaseを選択し実行したら一瞬で計算が終わりました。約2^64の計算量であるので明らかに終わらないはずなのですがどうしてなんでしょうか? #include <stdlib.h> #include <stdio.h> void main() { unsigned int y; unsigned int x3; unsigned int out[16]={0}; for(y=0x1;y<=0xfffffffe;y=y+0x1){ for(x3=0x1;x3<=0xfffffffe;x3=x3+0x1){ x3 = x3 +1; y = y + 1; out[15] = y; } } //printf("%0x\n",out[15]); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
別に実行毎に計算結果が変わるわけでもないので最適化の段階で事前計算されてしまったのでは?
その他の回答 (3)
- Ekukos_bloomers
- ベストアンサー率15% (19/123)
もう、回答は出ているようですが…。 最適化は、オプションスイッチで制御することができます。 最適化を「無し」にすれば、きっと長い時間かかることでしょう。 どこかで設定できると思います。 私は、Win系ではプログラムを書かないのですが、gccでは-O0で最適化無し、通常-O2でほぼ最高の最適化(最高の最適化は-O3らしい)、となります。
- a-saitoh
- ベストアンサー率30% (524/1722)
内側のfor文が for(.....;x3=x3+1) { 略 x3=x3+1 y=y+1 } になってますよ。これだと、ループを1回回るごとにx3が2つづつふえますね。さらにyも増えてしまいます。 そのため外側のfor文は1回しか回りません。 結局このプログラムは 2^31の計算量だと思います。
お礼
a-saitohさん お早い回答ありがとうございます。 質問をするとき、問題を簡略しようとして、for文のカウンタの変数とfor文の中で使う変数を一緒にしてしまい、すみませんでした。 a-saitohさんのおっしゃることは最もだと思います。 実際の原因は、MASA_Hの最適化だとわかりました。
- yukimican
- ベストアンサー率70% (112/159)
VC++6.0で上のソースをコピーして、Win32 releaseでビルドして試してみましたが、一瞬では終わりませんね。 ちなみに、テストした環境は Pen4 2.4GHz、メモリ512MB、WinXP Pro SP2です。 質問者様の環境で、リビルドして再度実行しても同じ結果でしょうか?
お礼
yumichanさん お早い回答ありがとうございます。 Win32 release でビルドすると一瞬で終わります。 ただ原因はNo.1のMASA_Hさんの指摘されたところにあったようです。 ちなみにテスト環境は Pentium 4 3.4GHz、 メモリ2GB、WinXP Pro SP2です。
お礼
MASA_Hさん お早い回答ありがとうございます。 なるほどいくらfor文を使ってなにかしらの計算をしても、そのデータを全く、後のプログラムにおいて使わないなら、コンパイルする時に、省かれて実際には計算されてないのですね(イイノカナコレデ) 道理でソースは簡略化のためいろいろ省いていたのですが、for文の中に条件に合うデータを配列に格納し、for文を抜けた後にその配列のデータを使う演算を入れると、終わらなくなる理由になります。 ありがとうございました。
補足
お礼を書き終わった時にふと思いました。 MASA_Hさんのお礼の内容のようにプログラムが走るとしたら。Win32 debugでビルドしても同じようにすぐ終わったりはしないんでしょうか?releseとdebugでの違いなんでしょうか?