■ リリース/デバッグビルドの違い
https://msdn.microsoft.com/ja-jp/library/dykf6bx9.aspxより、大きな違いは下記4点。 [1] ヒープ レイアウト [2] コンパイル [3] ポインター サポート [4] 最適化
[1] ヒープ レイアウト
* デバッグでは動作するがリリースではエラーとなる原因の約 90% を占める * 以下、体験談。http://blog.techlab-xe.net/archives/1698
[2] コンパイル
* ASSERT マクロはリリース ビルドでは評価されず、実行されない
[3] ポインター サポート
* リリース ビルドでは、不正なポインターが、デバッグ情報ではなく 初期化されていないメモリを指す可能性がある
[4] 最適化
* 最適化は、特定のコード セグメントの内容に応じて、予期しないコードを生成することがある => これがリリース ビルドの問題を引き起こすことはまれですが、問題が発生する場合もあるhttps://msdn.microsoft.com/ja-jp/library/xz7ttk5s.aspx
より * 最適化したコードをコンパイルすると、新たに警告メッセージが表示されることがあり、 これらの警告をよく確認すると、最適化に関する多くの問題を回避できる * 高速化のためにプログラムを最適化した結果、逆に速度が遅くなることもある(★これは知らなんだ★) => 最適化の方法によってはコード サイズが大きくなる 【例】関数をインライン展開すると関数呼び出しのオーバーヘッドはなるが、 インライン展開するコードが多すぎるとプログラムのサイズが大きくなり、 仮想メモリのページ フォールトの回数が増える
■ デバッグ時にのみ実行する
[1] 条件付きコンパイル・ディレクティブ(#ifディレクティブ)を使う方法
#if DEBUG // 何らかの文(リリースビルドでは実行されない) #endif
[2] Conditional属性を使う方法
[Conditional("DEBUG")] public void Xxxx() { // 何らかの文(リリースビルドでは、このメソッド自体実行されない) }
[3] Debugger.IsAttached を使う
if (System.Diagnostics.Debugger.IsAttached) { // デバッガ:ON } else { // デバッガ:OFF }
参考文献
http://www.atmarkit.co.jp/fdotnet/dotnettips/246debugonly/debugonly.html[3] Debugger.IsAttached を使う
http://www.atmarkit.co.jp/fdotnet/dotnettips/948debuggerattach/debuggerattach.html
■ リリース/デバッグビルドを切り替える
1) [ツール]-[オプション]のダイアログの左下隅の「すべての設定を表示」をチェック 2)「プロジェクトおよびソリューション」をクリック 3)「ビルド構成の詳細を表示」をチェック
関連記事
メモリ領域 ~静的領域 / スタック領域 / ヒープ領域 ~
ヒープについては、以下の関連記事を参照のことhttp://blogs.yahoo.co.jp/dk521123/34569082.html