Microsoft Visual C++ Redistributable這種東西為什麼不合併成一個?

(我還不知道這是幹什麼用的。。。)每隔兩年推出一個版本還各自獨立不向下兼容簡直太過分了,竟然還分x64版本。微軟為什麼不把他們做成一個程序包?呼啦啦一片感覺自己整個人都綜藝起來了。&<( ̄3 ̄)&>

——————————————————————————————————

(╬▔皿▔)凸為什麼微軟工程師都總有自己的思維模式啊!!!有沒有考慮我們這種收費時候用盜版免費了就來白佔便宜的恬不知恥的人的感受(╬▔皿▔)凸


嗯,如果合併的話,你只需要一個2M的dll,卻得下載一個100M的包。你就會問,為什麼不分開。


做向下兼容就沒法做很多改進,比如vector大小就不能改了,即使有更好的代碼能夠節省存儲空間也不能用,CString也不能改成模板類。同一個DLL要兼容32位和64位程序更加是不可能,64位程序載入不了32位DLL,反之亦然。

歷史上微軟曾經做過跨版本兼容的嘗試,比如VC6的CRT和VC5的程序不兼容導致很多程序的野指針問題被暴露出來導致崩潰(FIX: Freeing memory multiple times may cause an application error in Visual C++),結果在VC6 SP2裡面給CRT打補丁加了個VC5的堆,然後在運行時檢測調用者的模塊是VC5還是VC6編譯的(!)再決定用哪個堆。在VC14都已經出來的今天,這個VC5堆是否還應該存在很成疑問。很明顯這樣的兼容性補丁不是長久之道——每個Breaking Change都會導致CRT的一個內部分枝,把CRT搞的臃腫不堪是違反C++設計規則的——你用不到的語言特性不應該拖慢你的程序的速度。這也是微軟放棄了msvcrt.dll的跨版本兼容性支持而要求程序員們改用有版本號的msvcrxx.dll的原因。兼容性做得最好的微軟都做不到,其他CRT提供商的向後兼容性可想而知。

作為軟體開發者來說,我開發的時候會指定一個Visual C++ Redistributable版本,就是我開發的時候測試過的那一個版本,那個版本不存在我的程序就啟動不了(所以說只保留最新版Visual C++ Redistributable就可以的是在扯淡)。要是系統更新個有bug的Microsoft Visual C++ Redistributable我可能會在第二天早上接到幾千個憤怒的客戶電話和電子郵件。我會在測試之後沒有問題才更新我使用的Visual C++ Redistributable版本。用戶機器上裝的其他的Visual C++ Redistributable版本對我的程序來說並不存在,因為用不到。

C++用的地方很多,出bug的時候不是只有遊戲存檔丟失的可能而已,比如醫療軟體出問題有可能真的出人命。擺脫對舊的Visual C++ Redistributable的依賴的正確方法是去找開發者要更新的版本。

PS VC6SP2那個補丁不是說打上補丁之後軟體就可以正常工作,那些軟體應該是從未正常工作過。析構函數調用兩次鬼知道會搞出什麼,要是寫入越界數據損壞之後再覆蓋存檔,對於遊戲玩家們來說,或許是比遊戲崩潰更糟糕的結果。


為何不把Runtime Library 設置成Multi-threaded (/MT)這樣雖然靜態鏈接雖說exe體積大點,但是題主再也不用困擾你所說的問題,因為壓根不用什麼msvcxxxx.dll了


其實可以題主可以試一下只保留一個最新版(如VC++2015 Runtime)的32/64位版本,然後你就會發現很多要求13,12,10甚至05,08的軟體其實都是可以運行的,雖然沒說,但是其實大多數情況下是是向下兼容的,至於為什麼裝個VS的同時就一下自動裝了幾個版本(比如VS2015的時候,會把12,13,15的Runtime都裝上),還是為了兼容性吧,畢竟對於新版來說,是保留了大部分舊版本的特性,所以要求12的在只裝了13或者15的時候大部分情況下也是可以運行的,但是他並沒有特意做兼容,所以有些被拋棄的介面就自然用不了了,也就是那另一部分情況(程序強行檢測是不是安裝了某個版本VC庫的奇葩方法另議)


如果 Windows 平台上的程序都堅持使用最新的運行時環境,或者不持續更新就不能穩定地在 Windows 上跑,這個問題就不存在了,你永遠只用安裝最新的運行時。顯然,這是那些程序的事,不是微軟的問題。

至於整合到一個包,那要不要把各個版本的.NET運行時也整合到一起呢?要不要把各個版本的DirectX運行時也整合到一起呢?這麼搞,這個包會非常巨大,對很多用戶來說並不那麼「方便」,還不如缺什麼裝什麼。

話說回來,大型軟體或遊戲一般都會有一個文件夾用來放必需的運行時安裝程序,用之前逐個安裝一遍就好了,如果用 Steam 安裝遊戲,它們都會自動裝好。


你看見過Office97/03/07/12/16在一個軟體包裡面的么=3=


推薦閱讀:

在輪子哥的 UnitTest.h 當中這段代碼是什麼意思?
後台linux c/c++大型項目開發中 在windows下 大家一般用什麼工具編輯調試比較順手?
Unreal4有哪些令你印象深刻拍案叫絕的設計?
有沒有C++的web伺服器?

TAG:微軟Microsoft | C | VisualC |