生成されたアセンブリのアプローチをチェックしたい場合は、次の方法で実行できます。
私はあなたの2つの関数が2つのファイルに入れられていると仮定していa.c
ますb.c
:
$ gcc -O0 -S a.c
$ gcc -O0 -S b.c
$ diff a.s b.s
1c1
< .file "a.c"
---
> .file "b.c"
13,14c13,14
< leaq -4(%rbp), %rsi
< leaq -8(%rbp), %rdi
---
> leaq -8(%rbp), %rsi
> leaq -4(%rbp), %rdi
17,18c17,18
< movl -8(%rbp), %edx
< movl -4(%rbp), %eax
---
> movl -4(%rbp), %edx
> movl -8(%rbp), %eax
$
アーティファクトが最適化されないように、最適化 (-O0) をオフにします。
したがって、驚くべきことに、gcc (4.1.2) の出力は、これら 2 つの関数でわずかに異なります。しかし、これを少し注意深く見ると、理由がわかります。最初の関数でb
は is beforeが宣言されているa
ため、スタックのb
上a
にありますが、2 番目の関数では逆になっています。
したがって、スワップするa
とb
、生成されたアセンブリが実際には同一であることがわかります。
$ gcc -O0 -S b1.c
$ diff a.s b1.s
1c1
< .file "a.c"
---
> .file "b1.c"
$
または、生成されたアセンブリが実際に何であるかではなく、生成されたアセンブリが異なるかどうかのみを気にする場合は、これをすべて 1 つの派手な bash コマンドで行うことができます。
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b.c | gcc -O0 -S -xc - -o-)
Files /dev/fd/63 and /dev/fd/62 differ
$ echo $?
1
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b1.c | gcc -O0 -S -xc - -o-)
$ echo $?
0
$