可以使用汇编查看两个函数在汇编层面的区别,并通过编译器选项来控制编译器是否进行优化。
示例如下:
int foo(int a, int b){
return a + b;
}
int bar(int a, int b){
return a + b;
}
使用gcc编译并生成汇编代码:
gcc -S -fverbose-asm -O2 test.c -o test.s
其中,-S表示只生成汇编代码,-fverbose-asm选项可以提高汇编代码的可读性,-O2表示开启优化,test.c是源文件,-o test.s指定输出文件名为test.s。
查看汇编代码:
_Z3fooii:
.LFB0:
.cfi_startproc
addl %esi, %edi
movl %edi, %eax
ret
.cfi_endproc
.LFE0:
.size _Z3fooii, .-_Z3fooii
.section .text._Z3barii,"axG",@progbits,_Z3barii,comdat
.align 2
.weak _Z3barii
.type _Z3barii, @function
_Z3barii:
.LFB1:
.cfi_startproc
addl %esi, %edi
movl %edi, %eax
ret
.cfi_endproc
.LFE1:
.size _Z3barii, .-_Z3barii
从汇编代码可以看出,这两个函数在汇编层面是相同的。如果去掉-O2优化选项,重新生成汇编代码,则会发现两个函数的汇编代码是不同的。
因此,我们可以通过查看汇编代码来验证编译器是否进行了优化,在编译器
上一篇:编译器是否真的产生机器码?