在技术不断更迭的软件开发世界中,市场上 C++ 编译器的数量开始持续呈现下降趋势。而随着新的高级 C++ 标准(C++ 17、C++ 20)、新的指令集扩展、以及代码优化的更高标准的出现,究竟什么样的编译器才算优秀?

作者 | Agner

译者 | 苏本如,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

近年来,市场上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】

让人脸红心跳的一场python数据分析

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

 热 文 推 荐 

点击阅读原文,即刻阅读《程序员大本营》最新期刊。

你点的每个“在看”,我都认真当成了喜欢

最好的 Windows C++ 编译器!相关推荐

  1. Windows MVSC编译器实现Xtended Flow Guard(XFG)保护机制的原理分析

    一.前言 近期,微软正在开发Xtended Flow Guard(XFG),这是Control Flow Guard(控制流防护,CFG)的演进版本,作为其自身的控制流完整性实现.XFG通过不同类型函 ...

  2. linux c语言显示器api,API级别的Unicode GUI用于Windows / Linux / Mac的C语言本机应用程序...

    API级Unicode GUI用于Windows / Linux / Mac OS X的C中的本机应用程序 . 我正在寻找一个简单的 Unicode , GUI , Native 应用程序,它可以在不 ...

  3. OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程

    OpenGL 开发环境配置(Windows) - Visual Studio 2017 + GLFW + GLAD 详细图文教程 大部分 OpenGL 是直接面向设备商的,如果开发者需要使用 Open ...

  4. cmake 指定编译器_我们需要懂得CMake文件

    我们需要懂得CMake文件 一.前言 从事于linux下的C++开发的人员都知道,在C++下编写程序是没有类似windows下编译器的一键编译和运行的按钮,只能由我们开发人员进行手动编译.运行:为了减 ...

  5. windows删除文件c语言函数,c rename()函数是否删除文件?

    我正在用C编程语言练习编程,并正在尝试使用rename()函数.我使用以下代码: #include #include int main(void) { if(rename ("data&qu ...

  6. windows 10下 opessl 64位编译

    说明 项目中先前运行程序全部是编译成32位版本进行发版,现进行改造改为64位版本进行发布.涉及到第三方依赖库全需对应编译出64位依赖库. 环境 Windows 10 编译器 vs 2010 (由于本机 ...

  7. mingw版本下qt与HTML,QT5.10开发(2) 在Windows 10下使用MinGW编译 静态Qt 5.10 release版 详细过程...

    Qt建议安装动态链接Dbug版和编译安装静态链接release版 前提: 先安装动态链接Dbug版,方法:QT5.10开发(1)安装QT5.10 地址:http://blog.csdn.net/qq_ ...

  8. windows和linux下源码编译7-Zip(7za)

    windows和linux下源码编译7-Zip(7za) 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 文章目录 windows和l ...

  9. windows下python利用f2py调用Fortran

    目录 1.运行环境 2.测试实例 3.参考文章 Fortran(Formula Translation)是世界上第一个被正式推广使用的高级语言,其目前仍然是数值计算领域最重要的编程语言之一,虽然有ju ...

最新文章

  1. atitit.跨架构 bs cs解决方案. 自定义web服务器的实现方案 java .net jetty  HttpListener...
  2. Java基类共同属性设置_java – 你有一个Hibernate实体的基类吗?
  3. matlab中svd函数用法总结
  4. 大数据 就业 缺口_大数据人才缺口大!乌兰察布从政策激励等方面吸引人才
  5. mysql与缓存脏读_MySQL 事务的隔离级别问题 之 脏读
  6. 阿里第一颗芯片问世,平头哥发布最强AI芯片含光800
  7. VC++CopyFile函数的用法
  8. java hashmap 实现 序列化_java – Jackson JSON对象映射器反序列化为LinkedHashMap而不是HashMap...
  9. 网站服务器倒闭,云服务器商倒闭怎么办
  10. Java-java.io.BufferedInputStream
  11. 仿Linux中的cp操作
  12. linux服务器raid逻辑盘迁移,raid空闲盘的热迁移
  13. 【梳理】离散数学 第15章 欧拉图与哈密顿图 15.3 最短路问题、中国邮递员问题与货郎担问题
  14. 42个最好的海外 app ASO工具
  15. windows副本未通过正版windows验证的解决!
  16. 赋crontab -e 权限以及使用命令详解
  17. Java_笛卡尔积计算
  18. git rebase出错:Cannot rebase:You have unstaged changes
  19. 使用gdebi去解决安装deb包的时候软件依赖问题
  20. 【转】详解冠状面_水平面_矢状面_窗宽_窗位

热门文章

  1. docker on marathonmesos示例
  2. [SSH] 传输文件
  3. 矩池云上缺少cusparse.h头文件解决方法
  4. 字符串分割 异常 泛型 练习
  5. 剑指Offer之寻找二叉搜索树的第k个节点
  6. 【图像融合】主成分分析PCA
  7. 【图像处理】MATLAB:直方图
  8. Qt与HTML/JavaScript网页端通信和调用
  9. 打开旧Flutter项目说:Your Flutter application is created using an older version of the Android embedding
  10. 电子过载继电器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)