私はこれらの両方のコンパイラを異なるプロジェクトで使用しました。clangとgccの違い
コード処理と出力世代の違いはどうですか?例えば、gcc
とclang
の両方には、最適化のために-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) {
if(num % 2 == 1)
return num * num;
else
return num * num +1;
}
は-O2と打ち鳴らすとgccで出力アセンブリです:私は、私は次のコードを持っている場合など、少しテストをしました異なる指示がある。だから私の質問は、彼らの1つは、別のプロジェクトで別のものよりも優位性がありますか?
代わりに 'int foo(int num){return num * num +〜num & 1;}'と書いてコードを改善することができます。 – fuz
@FUZxxl:すごくいい点は、もっと良いコードを作ることです(https://godbolt.org/g/Y1RZuj)が、int foo(int num){return num * num +(〜num & 1);} '〜'は*や+よりも優先順位が低いため、負の数では異なる動作をしますので、Cでは '-1%2 'は' -1'なので、ifはfalseです。 'n * n +(n%2)'と書いてください。 –
@FUZxxl注釈のおかげで、どのコンパイラが何を出力するかを調べるだけの簡単なテストになります。 – Pooya