1. 程式人生 > >VS中的多執行緒(/MT)、多執行緒除錯(/MTd)、多執行緒DLL(/MD)、多執行緒除錯DLL(/MDd)的區別

VS中的多執行緒(/MT)、多執行緒除錯(/MTd)、多執行緒DLL(/MD)、多執行緒除錯DLL(/MDd)的區別

一種語言的開發環境往往會附帶有語言庫,這些庫就是對作業系統的API的包裝,我們也稱這些語言庫為執行庫

對於MSVC的執行庫(CRT),按照靜態/動態連結,可以分為靜態版和動態版;按照除錯/釋出,可以分為除錯版本和釋出版本;按照單執行緒/多執行緒,可以分為單執行緒版本和多執行緒版本(但是目前VS中已不提供單執行緒版本了)

在除錯模式下,使用除錯執行庫:多執行緒除錯(/MTd)、多執行緒除錯DLL(/MDd)

在釋出模式下,使用釋出執行庫:多執行緒(/MT)、多執行緒DLL(/MD)

除錯模式下執行庫帶d,但釋出模式不帶。除錯與釋出的區別在於,釋出模式省略了程式的除錯資訊,簡單來說就是刪除了除錯模式下的用於除錯的內容,所以一般情況下,釋出模式下生成的可執行檔案的大小比除錯模式下生成的要小

靜態連結:多執行緒(/MT)、多執行緒除錯(/MTd)

動態連結:多執行緒DLL(/MD)、多執行緒除錯DLL(/MDd)

動態連結為D,靜態連結為T。兩者的區別在於,靜態連結將程式所依賴的執行庫整合到了可執行檔案中,可執行檔案執行時不再需要執行庫;動態連結沒有把程式所依賴的執行庫整合到可執行檔案中,可執行檔案執行時需要執行庫。由於靜態連結將程式所依賴的執行庫整合到了可執行檔案中,一般情況下,生成的可執行檔案的大小大於動態連結生成的

對這四種執行庫的選在位於VS的專案屬性-》C/C++-》程式碼生成-》執行庫:

例項

原始碼:

  1. #include <iostream>

  2. using namespace std;

  3. int main()

  4. {

  5. cout << "Hello World!" << endl;

  6. system("pause");

  7. return 0;

  8. }

(以下實驗均在Win10+VS2017下完成)

Win32、debug模式下:

Win32、release模式下:

我們可以發現,在同種模式下,動態連結小於靜態連結;在同種連結下,release模式小於debug模式

在x64、debug模式下:

在x64、release模式下:

同種模式和連結下,x64下生成的可執行檔案大小大於Win32下生成的