Answers:
Clang有更好的错误报告。例如,如果您在调用的函数名称中输入错字,Clang会报告这很可能是错字(并提供正确的名称),而GCC会抱怨未知的函数名。
如果您针对x86 / x86-64,GCC通常会产生更快的代码。对于ARM,情况是模棱两可的,通常Clang会更好地进行优化。另外,AFAIK Clang不支持代码大小优化。
GCC使用了很多启发式方法。这对于提高性能(在典型情况下)很有好处,但是如果您要进行一些源代码级的优化(例如,循环展开),则太糟糕了。即使很小的源代码更改也可以使GCC生成完全不同的输出。Clang更可预测,通常它会生成您期望的代码。
与Jerry Coffin不同,我发现从源代码构建GCC比Clang困难得多。Clang入门页面中的过程始终对我有用。类似的GCC手册在第一次尝试中从未奏效。GCC依赖于特定版本的GMP,MPFR,MPC,Parma Polyhedra库和CLooG,因此我需要进行几次迭代才能找到适用于特定GCC版本的版本(是的,使用这些库的最新版本不起作用)。
我觉得Clang比GCC受到更好的测试。即使我只使用GCC的正式版本,它有时也会产生错误的代码。对于Clang,我通常使用主干版本(再次,因为它易于构建),但是我从未见过它生成错误的输出。
GCC在Linux世界中几乎是标准的,并且添加了许多非标准功能,这些功能在Linux软件中得到了广泛使用。Clang试图与GCC兼容,但是有时它只是悄悄地忽略了它们。最重要的是,Clang不支持OpenMP。但是,它也具有GCC不支持的扩展名,但可能是有用的(例如,随身携带的内在函数__buildin_addc)。
如果您想进行编译器研究,或者只是想知道它的工作方式,您会发现Clang / LLVM源代码更易于访问。Clang / LLVM代码是人类可读的,而不仅仅是编译器可读的。
(适用AINAL免责声明)Clang / LLVM许可证使您可以更自由地使用代码,例如在商业或封闭源代码产品中使用。当Clang编译器运行时(compiler-rt库)在许可的MIT许可下时,GCC运行时库的许可证增加了另一层限制。
简介:在开发程序时,请使用Clang进行编译,并在最终构建时使用GCC进行编译(但请确保其运行速度更快且不会中断)。如果进行编译器研究,请坚持使用Clang / LLVM。
__builtin_add
不是__buildin_addc
。无论如何,当Clang addc
遇到一个使用比较作为进位的
__builtin_addc
不是__buildin_addc