1. 程式人生 > >執行時庫 MT\MD的區分和優劣

執行時庫 MT\MD的區分和優劣

  VC專案屬性→配置屬性→C/C++→程式碼生成→執行時庫 可以採用的方式有:多執行緒(/MT)、多執行緒除錯(/MTd)、多執行緒DLL(/MD)、多執行緒除錯DLL(/MDd)、單執行緒(/ML)、單執行緒除錯(/MLd)

Reusable Library    Switch    Library    Macro(s) Defined
Single Threaded    /ML    LIBC    (none)
Static MultiThread    /MT    LIBCMT    _MT
Dynamic Link (DLL)    /MD    MSVCRT    _MT and _DLL
Debug Single Threaded    /MLd    LIBCD    _DEBUG
Debug Static MultiThread    /MTd    LIBCMTD    _DEBUG and _MT
Debug Dynamic Link (DLL)    /MDd    MSVCRTD    _DEBUG, _MT, and _DLL
    其中以小寫“d”結尾的選項表示的DEBUG版本的,沒有“d”的為RELEASE版本。大型專案中必須要求所有元件和第三方庫的執行時庫是統一的,否則將會出現LNK2005井噴。

    單執行緒執行時庫選項/ML和/MLd在VS2003以後就被廢了。

    /MT和/MTd表示採用多執行緒CRT庫的靜態lib版本。該選項會在編譯時將執行時庫以靜態lib的形式完全嵌入。該選項生成的可執行檔案執行時不需要執行時庫dll的參加,會獲得輕微的效能提升,但最終生成的二進位制程式碼因鏈入龐大的執行時庫實現而變得非常臃腫。當某專案以靜態連結庫的形式嵌入到多個專案,則可能造成執行時庫的記憶體管理有多份,最終將導致致命的“Invalid Address specified to RtlValidateHeap”問題。另外託管C++和CLI中不再支援/MT和/MTd選項。

    /MD和/MDd表示採用多執行緒CRT庫的動態dll版本,會使應用程式使用執行時庫特定版本的多執行緒DLL。連結時將按照傳統VC連結dll的方式將執行時庫MSVCRxx.DLL的匯入庫MSVCRT.lib連結,在執行時要求安裝了相應版本的VC執行時庫可再發行元件包(當然把這些執行時庫dll放在應用程式目錄下也是可以的)。 因/MD和/MDd方式不會將執行時庫連結到可執行檔案內部,可有效減少可執行檔案尺寸。當多專案以MD方式運作時,其內部會採用同一個堆,記憶體管理將被簡化,跨模組記憶體管理問題也能得到緩解。

    結論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要採用了。