GCC/Clang/C++各编译器版本优势对比

首先声明结论数据转自:http://clang.llvm.org/comparison.html
http://www.qingpingshan.com/rjbc/cyy/316577.html
https://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html

最近在算法移植时用到luxand人脸检测识别算法(目前版本相比国内人脸识别差距较大,玩玩就好),由于使用编译器版本及参数不同导致部分平台无法运行,故而了解下不同编译器差别。

主要结论:
Clang 比GCC 快得多,使用的内存也少得多。
GCC获得GPL许可证。 clang使用BSD许可证,该许可证允许它被嵌入到非GPL许可的软件中。
在许多方面,Clang对C ++的支持比GCC更加合规。
Clang的C和C ++支持比Elsa更加成熟和实用,并且包含许多C ++ 11的特性。

看起来 clang 在编译时间上做了大量优化。clang-4.0.1 的编译速度要快于 clang-3.9 。尽管 GCC-7.1 要快于 GCC-6.3,所有的 GCC 版本要慢于 GCC-4.9,GCC-4.9 是编译优化代码最快的 GCC 版本GCC-7.1 是在 Debug 模式下代码编译最快的 GCC 版本

在某些情况下,不同的编译器所生成的代码之间几乎没有区别。然而,在更为复杂的算法中,例如矩阵相乘或是二维卷积,其间的区别非常明显。 clang 已经显示出更适合于编译非优化代码。然而,特别在 GEMM 测试中,在处理手动优化的代码时似乎弱于 GCC

看到GCC在处理优化代码方面通常是最好的(特别是对于GEMM)。

总体而言,clang-4.0.1和GCC-7.1似乎做的很不错。

GCC
GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。
GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。

LLVM
LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。

Clang历史
Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。
正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最早完成,而由于Objective-C相对简单,只是C语言的一个简单扩展,很多情况下甚至可以等价地改写为C语言对Objective-C运行库的函数调用,因此在2009年时,已经完全可以用于生产环境。C++的支持也热火朝天地进行着。

下面这张图将显示GCC、LLVM-GCC、LLVM Compiler这三个编译选项的不同点:
GCC/Clang/C++各编译器版本优势对比_第1张图片

对比

Clang特性
快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~和^的提示,相比之下 GCC 的提示很天书。
GCC 兼容性。
设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。

当然,GCC 也有其优势

支持 JAVA/ADA/FORTRAN
当前的 Clang 的 C++ 支持落后于 GCC,参见http://clang.llvm.org/cxx_status.html。(近日 Clang 已经可以自编译,见http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw)
GCC 支持更多平台
GCC 更流行,广泛使用,支持完备
GCC 基于 C,不需要 C++ 编译器即可编译

你可能感兴趣的:(工具类)