我在不同的项目中使用了这两个编译器.
它们在代码处理和输出生成方面有何不同?例如两者gcc并clang具有-O2优化的选项.它们在优化代码方面是否以相同的方式运行(高级别)?我做了一点测试,例如,如果我有以下代码:
int foo(int num) {
if(num % 2 == 1)
return num * num;
else
return num * num +1;
}
Run Code Online (Sandbox Code Playgroud)
以下是带有-ng的clang和gcc的输出程序集:
----gcc 5.3.0----- ----clang 3.8.0----
foo(int): foo(int):
movl %edi, %edx movl %edi, %eax
shrl $31, %edx shrl $31, %eax
leal (%rdi,%rdx), %eax addl %edi, %eax
andl $1, %eax andl $-2, %eax
subl %edx, %eax movl %edi, %ecx
cmpl $1, %eax subl %eax, %ecx
je .L5 imull %edi, %edi
imull %edi, %edi cmpl …Run Code Online (Sandbox Code Playgroud) 我刚下载了CLang源代码,使用CMake创建了一个Visual C++ 10 IDE工作区,并构建了Visual C++ 10.0(express)中的所有内容.
现在我在hello world上遇到了一堆链接器错误:
d:\dev\test> type con >foo.cpp
#include <iostream>
using namespace std;
int main() { cout << "Hello, cling-clong world!" << endl; }
^Z
d:\dev\test> clang++ foo.cpp
foo-839435.o : error LNK2019: unresolved external symbol __ZSt4cout referenced in function _main
foo-839435.o : error LNK2019: unresolved external symbol __ZdlPv referenced in function __ZNSt14error_categoryD0Ev
foo-839435.o : error LNK2019: unresolved external symbol __ZSt18uncaught_exceptionv referenced in function __ZNSo6sentry
D2Ev
foo-839435.o : error LNK2019: unresolved external symbol ___cxa_rethrow referenced in function … 我将gcc和llvm-gcc与hmmer中的-O3选项和spec cpu2006基准测试中的mcf进行了比较.令人惊讶的是,我发现gcc在两种情况下都击败了llvm-gcc.是因为-O3有不同的含义吗?我应该如何建立实验以获得公平的比较?
顺便说一下,我只是通过改变makefile中的cc来做实验.
谢谢,博