VC++中有六種Runtime Library的類型:redis
類型 | 簡稱 | 含義 | 對應的庫名稱 | 備註 |
---|---|---|---|---|
Single-Threaded | /ML | Release版的單線程靜態庫 | libc.lib | VS2003之後被廢棄 |
Single-Threaded Debug | /MLd | Debug版的單線程靜態庫 | libcd.lib | VS2003之後被廢棄 |
Multi-threaded | /MT | Release版的多線程靜態庫 | libcmt.lib | |
Multi-threaded Debug | /MTd | Debug版的多線程靜態庫 | libcmtd.lib | |
Multi-threaded DLL | /MD | Release版的多線程動態庫 | msvcrt.lib+msvcrtxx.dll | |
Multi-threaded DLL Debug | MDd | Debug版的多線程動態庫 | msvcrtd.lib+msvcrtxxd.dll |
你能夠在VS的安裝目錄下找到這些庫文件,如個人VS2010安裝在C:\Program Files (x86)\Microsoft Visual Studio 10.0,則能夠在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\和C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\中分別找到對應32位和64位的libcmt.lib、libcmtd.lib、msvcrt.lib、 msvcrtd.lib庫。libc.lib和libcd.lib因爲在VS2005就已經廢棄了,因此在這確定找不到。多線程
經過上面的表格你會發現,多線程的動態運行時庫是|msvcrt.lib+msvcrtxx.dll,之因此是msvcrtxx.dll是由於每一 個版本的VS使用的庫名稱還不同。並且還不止包含一個庫,除了主要的MSVCRT庫外,還有MSVCPRT、MSVCIRT庫。它們之間的對應關係如 下:函數
導入庫 | MSVCRT.LIB | MSVCRTD.LIB | MSVCPRT.LIB | MSVCPRTD.LIB | MSVCIRT.LIB | MSVCIRTD.LIB |
---|---|---|---|---|---|---|
Visual C++ 5.0 | MSVCRT.DLL | MSVCRTD.DLL | MSVCP5.DLL | MSVCP5D.DLL | MSVCIRT.DLL | MSVCIRTD.DLL |
Visual C++ 6.0 | MSVCRT.DLL | MSVCRTD.DLL | MSVCP6.DLL | MSVCP6D.DLL | MSVCIRT.DLL | MSVCIRTD.DLL |
Visual C++ .NET 2002 | MSVCR70.DLL | MSVCR70D.DLL | MSVCP70.DLL | MSVCP70D.DLL | ||
Visual C++ .NET 2003 | MSVCR71.DLL | MSVCR71D.DLL | MSVCP71.DLL | MSVCP71D.DLL | ||
Visual C++ 2005 | MSVCR80.DLL | MSVCR80D.DLL | MSVCP80.DLL | MSVCP80D.DLL | ||
Visual C++ 2008 | MSVCR90.DLL | MSVCR90.DLL | MSVCP90.DLL | MSVCP90D.DLL | ||
Visual C++ 2010 | MSVCR100.DLL | MSVCR100D.DLL | MSVCP100.DLL | MSVCP100D.DLL |
參考閱讀:https://support.microsoft.com/en-us/kb/154753性能
在你的VS安裝目錄下(如C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x64\Microsoft.VC100.CRT),及系統目錄C:\Windows\System3二、C: \Windows\SysWOW64下都能找到對應的.dll庫。spa
不少的軟件在發佈本身的產品時也都會帶上這些DLL(防止用戶的操做系統沒有安裝VS,或在系統目錄下找不到對應的DLL),如我電腦上的百度影音 安裝目錄下就有MSVCR71.DLL(C:\Program Files (x86)\baidu\BaiduPlayer\4.1.2.286\MSVCR71.DLL),WPS的安裝目錄下有msvcr100.dll(C: \Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcr100.dll)和msvcp100.dll(C:\Program Files (x86)\WPS Office\9.1.0.5132\wtoolex\msvcp100.dll)操作系統
(1). 靜態連接的單線程庫
靜態連接的單線程庫只能用於單線程的應用程序, C 運行時庫的目標代碼最終被編譯在應用程序的二進制文件中。經過 /ML 編譯選項能夠設置 Visual C++ 使用靜態連接的單線
程庫。
(2). 靜態連接的多線程庫
靜態連接的多線程庫的目標代碼也最終被編譯在應用程序的二進制文件中,可是它能夠在多線程程序中使用。經過 /MT 編譯選項能夠設置 Visual C++ 使用靜態連接的多線程庫。
該選項生成的可執行文件運行時不須要運行時庫dll的參加,會得到輕微的性能提高,但最終生成的二進制代碼因鏈入龐大的運行時庫實現而變得很是臃腫。當某 項目以靜態連接庫的形式嵌入到多個項目,則可能形成運行時庫的內存管理有多份,最終將致使致命的「Invalid Address specified to RtlValidateHeap」問題。
(3). 動態連接的運行時庫
動態連接的運行時庫將全部的 C 庫函數保存在一個單獨的動態連接庫 MSVCRTxx.DLL 中, MSVCRTxx.DLL 處理了多線程問題。使用 /MD 編譯選項能夠設置 Visual C++ 使用動態。
連接時將按照傳統VC連接dll的方式將運行時庫MSVCRxx.DLL的導入庫MSVCRT.lib連接,在運行時要求安裝了相應版本的VC運行時庫可 再發行組件包(固然把這些運行時庫dll放在應用程序目錄下也是能夠的)。 因/MD和/MDd方式不會將運行時庫連接到可執行文件內部,可有效減小可執行文件尺寸。當多項目以MD方式運做時,其內部會採用同一個堆,內存管理將被 簡化,跨模塊內存管理問題也能獲得緩解。線程
/MDd 、 /MLd 或 /MTd 選項使用 Debug runtime library( 調試版本的運行時刻函數庫 ) ,與 /MD 、 /ML 或 /MT 分別對應。 Debug 版本的 Runtime Library 包含了調試信息,並採用了一些保護機制以幫助發現錯誤,增強了對錯誤的檢測,所以在運行性能方面比不上 Release 版本。調試
結論:/MD和/MDd將是潮流所趨,/ML和/MLd方式請及時放棄,/MT和/MTd在非必要時最好也不要採用了。內存