Debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何最佳化,便於程式設計師除錯程式。Release 稱為釋出版本,它往往是進行了各種最佳化,使得程式在程式碼大小和執行速度上都是最優的,以便使用者很好地使用。
Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(除錯版本的執行時刻函式庫)
/Od 關閉最佳化開關
/D "_DEBUG" 相當於 #define _DEBUG,開啟編譯除錯程式碼開關(主要針對
assert函式)
/ZI 建立 Edit and continue(編輯繼續)資料庫,這樣在除錯過
程中如果修改了原始碼不需重新編譯
/GZ 可以幫助捕獲記憶體錯誤
/Gm 開啟最小化重連結開關,減少連結時間
Release 版本:
/MD /ML 或 /MT 使用釋出版本的執行時刻函式庫
/O1 或 /O2 最佳化開關,使程式最小或最快
/D "NDEBUG" 關閉條件編譯除錯程式碼開關(即不編譯assert函式)
/GF 合併重複的字串,並將字串常量放到只讀記憶體,防止
被修改
實際上,Debug 和 Release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到最佳化過的除錯版本或是帶跟蹤語句的釋出版本。
二、哪些情況下 Release 版會出錯
有了上面的介紹,我們再來逐個對照這些選項看看 Release 版錯誤是怎樣產生的
1. Runtime Library:連結哪種執行時刻函式庫通常只對程式的效能產生影響。除錯版本的 Runtime Library 包含了除錯資訊,並採用了一些保護機制以幫助發現錯誤,因此效能不如釋出版本。編譯器提供的 Runtime Library 通常很穩定,不會造成 Release 版錯誤;倒是由於 Debug 的 Runtime Library 加強了對錯誤的檢測,如堆記憶體分配,有時會出現 Debug 有錯但 Release 正常的現象。應當指出的是,如果 Debug 有錯,即使 Release 正常,程式肯定是有 Bug 的,只不過可能是 Release 版的某次執行沒有表現出來而已。
Debug 通常稱為除錯版本,它包含除錯資訊,並且不作任何最佳化,便於程式設計師除錯程式。Release 稱為釋出版本,它往往是進行了各種最佳化,使得程式在程式碼大小和執行速度上都是最優的,以便使用者很好地使用。
Debug 版本:
/MDd /MLd 或 /MTd 使用 Debug runtime library(除錯版本的執行時刻函式庫)
/Od 關閉最佳化開關
/D "_DEBUG" 相當於 #define _DEBUG,開啟編譯除錯程式碼開關(主要針對
assert函式)
/ZI 建立 Edit and continue(編輯繼續)資料庫,這樣在除錯過
程中如果修改了原始碼不需重新編譯
/GZ 可以幫助捕獲記憶體錯誤
/Gm 開啟最小化重連結開關,減少連結時間
Release 版本:
/MD /ML 或 /MT 使用釋出版本的執行時刻函式庫
/O1 或 /O2 最佳化開關,使程式最小或最快
/D "NDEBUG" 關閉條件編譯除錯程式碼開關(即不編譯assert函式)
/GF 合併重複的字串,並將字串常量放到只讀記憶體,防止
被修改
實際上,Debug 和 Release 並沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。事實上,我們甚至可以修改這些選項,從而得到最佳化過的除錯版本或是帶跟蹤語句的釋出版本。
二、哪些情況下 Release 版會出錯
有了上面的介紹,我們再來逐個對照這些選項看看 Release 版錯誤是怎樣產生的
1. Runtime Library:連結哪種執行時刻函式庫通常只對程式的效能產生影響。除錯版本的 Runtime Library 包含了除錯資訊,並採用了一些保護機制以幫助發現錯誤,因此效能不如釋出版本。編譯器提供的 Runtime Library 通常很穩定,不會造成 Release 版錯誤;倒是由於 Debug 的 Runtime Library 加強了對錯誤的檢測,如堆記憶體分配,有時會出現 Debug 有錯但 Release 正常的現象。應當指出的是,如果 Debug 有錯,即使 Release 正常,程式肯定是有 Bug 的,只不過可能是 Release 版的某次執行沒有表現出來而已。