なぜ10億回以上をループするのはずっと時間がかかりますか?

なぜ、このループ(10億まで)はわずかな音だけを実行するのですか?

for (i = 0; i < 1000000000; i++)
{

}

... but this loop (to 10 billion) takes >10 minutes?

for (i = 0; i < 10000000000; i++)
{

}

30秒ほどかかりませんか?(3秒x 10)?

5
私のタイプは何ですか?あなたは64ビットをターゲットにしていますか?
追加された 著者 Richard Berg,
@MOleYArd私は彼が10分待ってそれを殺したと推測したいと思う(これは> によっても暗示されている)。
追加された 著者 Christian Rau,
解決策はかなり明白ですが、詳細は実際に私には少し混乱しています。私は、この動作の具体的な理由についてフォローアップ質問に尋ねました。
追加された 著者 Christian Rau,
おそらく無限ループに陥っているだけです。 i が32ビット整数であると仮定すると、決して100億を超えることはありません。
追加された 著者 Mysticial,
iの型が十分に大きくない場合(i <10000000000)、TRUEに評価されるべきではないので、それは無限ループになります。しかし、彼はループが終了したと述べた。編集:実際に彼はそれがループかどうか終了していないかどうか明示していませんでした。それは本当に答えが明らかではない場合、彼/彼女は長いintを使用する必要があります。
追加された 著者 MOleYArd,
潜在的なオーバーフローを考えてください。多分、あなたの i は32ビット整数ですか?だからあなたはあなたが期待しているのと同じ数の反復をやっていないかもしれません。
追加された 著者 Artefact2,

4 答え

私は i は32ビットの整数変数で、常に100億(2 ^ 32以上)未満であるのに対し、10億は32ビットの範囲に収まっています署名に応じて約2〜40億)。コンパイラがこの100億の定数をどのように昇進させるのかはわかりませんが、彼はオーバーフローの問題を認識しているように見え、それを無限ループにしています。

ilong long int (おそらく 10000000000 10000000000L )にするとどうなりますか。問題ありません)?

10
追加された
これは、Cでの符号付きオーバーフローは未定義の動作であるため、コンパイラは何もすることができません。この場合、ループを無期限に選択しますこれは、値がオーバーフローしないことを前提としているためです
追加された 著者 Lưu Vĩnh Phúc,
ilong long に切り替え、 1000000000010000000000L に切り替えると効果があります。ありがとう。
追加された 著者 user99874,
はい、29秒で実行されます。再度、感謝します。
追加された 著者 user99874,

私はあなたがベンチマークしたコードをここに入れていないと思います。そのようなコードは、コンパイラによってまったく実行されないように最適化されるかもしれません。また、 i がオーバーフローしてループが終了しないこともあります。

しかし、データ構造体(特に配列の場合)のインデックスとして i を使用すると、パフォーマンスに大きな影響を与えるメモリページングとデータキャッシングが発生します。

2
追加された
終了ですか?または、あなたは10分間待ってプログラムをシャットダウンしましたか?
追加された 著者 littleadv,
@nbsp次に、オーバーフローのため無限ループになる可能性が最も高い。私はあなたがこれに関するコンパイル警告を得ていないのに驚いています。
追加された 著者 littleadv,
私はただそれをシャットダウンした。
追加された 著者 user99874,

違いは、1,000,000,000は32ビット整数に収まり、10,000,000,000は64ビットであることです。それが32ビットであれば、私はそれがだと仮定しようとしています。それはオーバーフローしており、ループが無限になることになります。

あなたの i は64ビットの変数ですか?

2
追加された
私は32ビット整数なので、これは正しいと思われます。
追加された 著者 user99874,
ありがとう。私はそれを読んでみましょう。
追加された 著者 user99874,
@ nbsp整数の限界についてもっと知りたい場合は、いつでもこれをご覧ください:慎重にWikipedia D:
追加された 著者 Nick Savage,

これが誰にも役立つ場合:

32ビット符号付き数が2 ^ 31 - 1の範囲を超えるとき、その数は(2C形式のために)負の数として解釈されます。 I.E:

16ビット数の場合:

  0111 1111 1111 1111 (32767)
+ 0000 0000 0000 0001 (1)
---------------------
  1000 0000 0000 0000  (Shoulbe 32769 but instead is -32768)
+ 0000 0000 0000 0001
--------------------
  1000 0000 0000 0001 (-32767)....

したがって、無限ループは、32ビットの符号付き整数のすべての値を調べているだけなので、無限ループです。

0
追加された