コンパイルオプション変更での挙動の変化

解決


  2011-03-04 01:09:21  No: 72393

環境:WinXP SP3 VC++6

いつもお世話になっております。
メニュー→プロジェクトの設定→C/C++で変更できる、
最適化で、実行速度(O2)もしくはプログラムサイズ(O1)を指定すると
挙動が変わるのですが何故こうなるのか教えて頂きたいです。
参考になるページでも良いのでお願い致します。

void hoge(int i, int ii)
{
  CString s;
  s.Format("%d %d\n", i, ii);
  AfxMessageBox(s);
}
void CMyTestDlg::OnButton1() 
{
  for(int i=0; i<5;)
    hoge(i++, i);
}

結果:
コンパイルオプションO2もしくはO1
0 1
1 2
2 3
3 4
4 5

コンパイルオプションODもしくはD
0 0
1 1
2 2
3 3
4 4

リリースの時のみ強制終了するバグを調べてたら行き着きました。
これって結構常識なんでしょうか・・・
オプション次第で挙動が変わる別の例などもあったら是非ご教授下さい。


瀬戸っぷ  2011-03-04 01:59:21  No: 72394

>最適化で、実行速度(O2)もしくはプログラムサイズ(O1)を指定すると
>挙動が変わるのですが何故こうなるのか教えて頂きたいです。

>hoge(i++, i);

未定義動作だから…じゃないですか?
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/23f65ca3-9cf6-49b4-9975-23a26fee4f20


  2011-03-04 02:23:11  No: 72395

瀬戸っぷ様

ご回答ありがとうございます、理解しました。
思い込みで勝手に書くとドはまりしますね。
調べてまた基礎から出直します・・・


  2011-03-04 02:24:22  No: 72396

すみません解決を入れ忘れました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加