最好的 Windows C++ 編譯器!

2021-01-05 CSDN

在技術不斷更迭的軟體開發世界中,市場上 C++ 編譯器的數量開始持續呈現下降趨勢。而隨著新的高級 C++ 標準(C++ 17、C++ 20)、新的指令集擴展、以及代碼優化的更高標準的出現,究竟什麼樣的編譯器才算優秀?

作者 | Agner

譯者 | 蘇本如,責編 | 屠敏

以下為譯文:

近年來,市場上C++編譯器的數量有所下降。一些不太知名的編譯器已經退出市場,甚至一度非常流行的Borland(Embarcadero)C++編譯器現在也不再被維護。隨著新的高級C++標準(C++ 17、C++ 20)、新的指令集擴展(如帶有數百條新指令的AVX512),以及代碼優化的更高標準的出現,編譯器的構建變得更加複雜。

微軟Visual Studio非常流行,因為它具有用戶友好的集成開發環境(IDE)和優秀的調試和交叉引用功能。但是Visual Studio在支持最新的指令集方面已經落後,在代碼優化方面它也不是最好的編譯器。

英特爾編譯器在代碼優化方面曾經處於領先地位,但是它現在已經被Gcc和Clang超越。而且,英特爾編譯器因為其隱藏的「讓AMD變殘」的功能被曝光後,也不再受歡迎了。

開源編譯器Gcc和Clang現在已經佔據領先地位。這兩個編譯器非常相似。兩者都支持所有平臺和最新的指令集擴展。

我已經測試了不同的C++編譯器,並把測試結果列在了我的C++手冊中。在代碼優化方面,Gcc和Clang編譯器顯然是最好的。Clang在某些方面優於Gcc,但它有過度循環展開的傾向,這是對代碼緩存的浪費。我必須承認,當LLVM/CLAN項目啟動時,我對它非常懷疑,但是當人們投入了大量的工作後,現在的Clang編譯器在多個量度上已經勝過所有其它編譯器。

在Linux和Mac上工作的程式設計師找到Clang編譯器時不會有任何問題。但是在Windows上有點複雜。Windows至少有兩個現成的Clang編譯器版本。Cygwin版本和Visual Studio插件版本。

Clang編譯器的Cygwin版本已經存在好幾年了,但是它還不是最新的,並且它有一些性能問題。默認情況下,Clang的Cygwin64版本使用的是中等內存模型。這是相當浪費的,因為它為靜態變量和常量使用64位絕對地址,而不是32位相對地址。你可以通過指定mcmodel=small來提高性能。中等內存模型只有在直接連結到外部DLL中的變量時才需要(這無論如何都是不好的編程實踐)。Cygwin版本的另一個缺點是,在分發可執行文件時必須包含Cygwin DLL。

最近,微軟將Cygwin版本作為Visual Studio的插件提供。我的測試表明,它生成了非常優化的代碼。Cygwin插件尚未集成到MSBuild框架中。它現在只支持CMake框架,使用起來相當複雜,因為你必須手動指定一個奇怪的微軟命令行選項和Clang選項的組合。事實上,我發現在沒有Visual Studio CMake框架的情況下,將Clang編譯器作為命令行工具使用更加方便。

微軟已經宣布,Clang與MSBuild框架的全面集成即將到來。希望微軟能夠兌現這個承諾。我們期待可能是最好的優化編譯器和用戶最友好的IDE框架的這一集成能夠儘快發生。

從長遠來看,我猜測Clang編譯器最終會取代微軟自己的編譯器。沒有理由微軟體會花費大量的資源來開發一個自己的編譯器,而它的性能無論如何都無法超越一個免費的開源編譯器。Visual Studio IDE仍然可以被維護,因為它非常有用,並且很多當前的項目都依賴於它,即使它的後端將有一個不同的編譯器。

我更加不確定英特爾編譯器的未來命運。當越來越少的程式設計師實際使用它時,英特爾會繼續維護它嗎?英特爾編譯器附帶了一些非常有用的函數庫,可用於許多特殊用途,但這些函數庫與其他編譯器的工作原理是一樣的。

原文:https://www.agner.org/optimize/blog/read.php?i=1015

本文為 CSDN 翻譯,轉載請註明來源出處。

【END】

熱 文 推 薦

海闊憑鯤躍 天高任鵬飛——從一場大賽看華為雲的鯤鵬之「智」

微信支付改革

Java 13 新特性全面解讀

我願出 2 倍工資,挖這個被裁的程式設計師!

阿里雲智能運維的自動化三劍客

免費開源!新學期必收藏的AI學習資源,從課件、工具到源碼都齊了

華為 | 泰山之巔 鯤鵬展翅 扶搖直上九萬裡

鴻蒙 OS 的到來,能為我們改變什麼?| 程式設計師大本營9月刊

厲害!接班馬雲的為何是張勇?

相關焦點

  • 快速上手Dev-c++編譯器,福利到,怎樣快速使用Dev-c++編譯器
    在學習C/C++語言的時候,我們會使用到各種各樣的語言編譯器,這些編譯器每個都相似,但是所擁有的界面以及提示都會有所差別,今天就讓我們簡單的學習怎樣快速使用Dev-c++編譯器,簡單的實現C語言的輸出。1.
  • 什麼樣的編譯器算優秀?Windows C++ 編譯器當屬第一
    但是Visual Studio在支持最新的指令集方面已經落後,在代碼優化方面它也不是最好的編譯器。英特爾編譯器在代碼優化方面曾經處於領先地位,但是它現在已經被Gcc和Clang超越。而且,英特爾編譯器因為其隱藏的「讓AMD變殘」的功能被曝光後,也不再受歡迎了。
  • Linux下C/C++編譯器gcc使用簡介
    1.gcc包含的c/c++編譯器本文引用地址:http://www.eepw.com.cn/article/257973.htmgcc,cc與c++,g++gcc和cc是一樣的,c++和g++是一樣的。一般c程序就用gcc編譯,c++程序就用g++編譯。
  • GCC 10編譯器已對C++20的主要功能協程 進行了初始支持
    最近發布的GCC 10 編譯器已對C++20 的主要功能協程(Co-Routines)進行了初始支持,但是除非顯式地開啟該選項,否則並不會啟用此功能。當 GCC 10 在C++20 模式(std=c++20) 中運行時,默認情況下會啟用C++ 協程。
  • 15 款最好的 C/C++ 編譯器和集成開發環境
    今天我們圍繞的主角是一些超級棒的 C 和 C++ 的集成開發環境(IDE)和編譯器。IDE 主要是在程式設計師開發時提供各種軟體應用組件,最受程式設計師受歡迎的 IDE 都有一個共同點,那就是非常有吸引力的用戶界面。這裡我們收集了一些最好的 C 和 C++ 的 IDEs 和編譯器。
  • gcc編譯器的基本使用
    GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的程式語言編譯器。它是以GPL許可證所發行的自由軟體,也是 GNU計劃的關鍵部分。GCC原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,GCC同樣適用於微軟的Windows。 GCC是自由軟體過程發展中的著名例子,由自由軟體基金會以GPL協議發布。GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。
  • ...C++ 編譯器支持 Android 集成至 Microsoft Visual Studio 2015
    問題英特爾® System Studio 2016 支持使用英特爾® C++ 編譯器和 Microsoft Visual Studio* 2015 (VS2015) IDE 進行原生 Android 開發。 如欲在 VS2015 IDE 中使用面向 Android 的英特爾® C++ 編譯器,要求自定義 VS2015 安裝。
  • c++的輸入與輸出
    c++輸入與輸出C++ 標準庫提供了一組豐富的輸入/輸出功能,本章將討論 C++ 編程中最基本和最常見的 I/O 操作。輸入輸出並不是c++語言的正式組成成分,c和c++沒有為輸入輸出提供專門的結構。在c語言中輸入輸出是通過調用scanf和printf 實現的,在c++中是通過調用流對象cin和cout實現的。
  • 10 個免費的 C/C++ 集成開發環境
    大多數的IDE包含編譯器和解釋器。例如微軟的 Visual Studio 本身內置的編譯器和解釋就是很好的例子,Eclipse 是另一個很好的例子。鼓勵程式設計師使用IDE的主要原因是開發軟體應用程式的各個組成部分之間可方便的進行切換。
  • 15款C/C++程式設計師必備的編譯器和IDE
    本文將整理一些讓人印象深刻的C/C++集成開發環境(IDE)和編譯器。IDE主要為軟體開發提供功能組件,其最吸引人的特性之一是其友好的用戶界面。幾天前,我在博客上和大家分享了一些IDE,今天我將著重介紹其中最廣受好評的幾款IDE 以及編譯器。
  • python3使用ctypes在windows中訪問C和C++動態連結庫函數示例
    python3使用ctypes在windows中訪問C和C++動態連結庫函數示例這是我們的第一個示例,我們儘量簡單,不傳參,不返回,不訪問其他的動態連結庫一 測試環境介紹和準備測試環境:作業系統:windows10Python
  • gcc編譯器使用(Linux C/C++開發第二篇)
    編譯器會在不花費太多編譯時間的同時試圖生成更快更小的代碼。這些優化是非常基礎的,但一般這些任務肯定能順利完成。選項-l選項-l(L的小寫)用來連接動態連結庫(共享庫)。關於動態連結庫(共享庫)的開發運用等知識,今後會分析給大家。例如:用gcc編譯一個使用了標準C++庫的C++源程序。
  • c++代碼整潔之道
    您或許會用 sizeof(type) 處理不涉及任何變量的代碼,比如處理來自外部或內部的數據格式,這時用變量就不合適了類型名如果過長的話可以考慮使用auto關鍵字注釋統一使用 // ,不要通過注釋禁用代碼,擅用git,不要為易懂的代碼寫注釋寫完代碼後記得format,VS Code(windows快捷鍵) shift + alt + F ,每個項目最好都有統一的
  • 微軟C++ 編譯器 20 周年
    本月,微軟 C++ 編譯器進入了第3個十年。 1992 年 2 月,微軟發布首個 C++ 編譯器 —— Microsoft C/C++ 7.0。而在此之前發布很多 C++ 預處理器編譯器,用於將 C++ 代碼轉成 C 後進行編譯。從 1992 年開始,微軟的編譯器開始直接支持 C++。 C/C++ 7.0 發布時支持生成基於 MS-DOS, Windows 和 OS/2 程序,緊接著微軟發布了 Visual C++ 產品,基於 QuickC 構建。後來還發布了支持 Windows 和嵌入式開發的工具。
  • 總結一下:VS2019中對C++20語言特性的支持
    今天我們將特別關注MSVC編譯器(cl.exe)中實現的C++20語言特性。有關STL相關的進展消息,我們會在Microsoft STL GitHub中進行發布。下面列出的一些特性中,有一些已經早在今年9月的舉行的CppCon 2020會議中就給大家介紹過,如果你還有印象的話。
  • C/C++主流編譯器推薦
    C/C++主流編譯器(非IDE集成開發環境)推薦GCCGCC(GNU Compiler Collection,GNU編譯器集合)包括C,C ++,WindowsCPU支持:Intel x86官網:/LLVM + ClangLLVM(Low Level Virtual Machine)是模塊化和可重用的編譯器及工具鏈技術的集合
  • Unix AIX和Linux C語言編譯器差別?
    xlc+++ 和 g++AIX上使用的是xlc++編譯器,Linux上使用的是g++編譯器。對C標準中沒有嚴格定義的行為,兩個編譯器的處理方式不一定相同,代碼在兩個平臺運行會有不一樣的表現。導致在一個平臺運行正常,另一個平臺可能就是bug了。
  • 推薦 10 款 C++ 在線編譯器
    它提供的編譯器支持 C++14,並且還具有代碼高亮、新建文件/項目、下載文件/項目、自定義設置(例如:主題色)、錯誤提示等功能。相當不錯,唯一的缺點是缺少智能提示!2.https://www.codechef.com/ideCodechef 的編譯器支持
  • 進度更新:VS2019 v16.8中對C++20模塊的支持
    /std:c++latest隱式包含C++模塊由於MSVC已經開始實現C++模塊標準,工具集會在任何時候都強制使用/experimental:module編譯開關。因為模塊已經被正式移入到C++20,編譯器團體做了大量的工作,終於將模塊合併到了/std:c++latest中。
  • 什麼是C語言的編譯器?從計算機原理的角度談編譯器
    早期的機器語言沒有編譯器的概念,因為機器語言不過是很多的0和1,CPU(處理器)能夠直接識別機器語言,C語言本身是為了提高開發效率而開發出的新語言,語義上幾乎和現實世界表達意思一致,但是這樣高級的語義可就難倒了計算機,它不認識像if-else、while等單詞,那麼計算機怎麼識別C程序的呢,這就引出編譯器的概念了。編譯器用於將高級語言向低級語言轉化。