我在不同的项目中都使用了这两个编译器。
它们在代码处理和输出生成方面有什么不同呢?例如,gcc
和clang
都有用于优化的-O2
选项。它们在优化代码方面是否以相同的方式(高级别)操作?我进行了一些测试,例如如果我有以下代码:
int foo(int num) {
if(num % 2 == 1)
return num * num;
else
return num * num +1;
}
以下是使用clang和gcc -O2选项的输出汇编:
----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 $1, %ecx
leal 1(%rdi), %eax setne %al
ret movzbl %al, %eax
.L5: addl %edi, %eax
movl %edi, %eax retq
imull %edi, %eax
ret
正如你所看到的,输出结果具有不同的指令。那么我的问题是,它们中的一个在不同的项目中是否更具优势?
int foo(int num) { return num * num + ~num & 1; }
来改进你的代码。 - fuzint foo(int num) { return num * num + (~num & 1); }
因为&
的优先级低于 * 和 +。此外,对于负数,它确实具有不同的行为。在 C 中,-1 % 2
是-1
,因此 if 语句为 false。如果您编写n*n + (n%2)
,gcc 的代码会考虑到这一点。 - Peter Cordesreturn num * num + ~num & 1;
你在开玩笑吗?那段代码很令人困惑,你在单行中犯了一个错误,原始代码对于更多的人来说更安全易维护。 - user1135541