我在文件 main.c 中有以下代码:
int main() {
int i;
for (i = 0; i < 5; i++) {
}
return 0;
}
当我用
gcc -x c -m32 -S -O0 -o main.s main.c
编译它时(在 Fedora 16 64 位下)我得到这个输出: .file "main.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
subl $16, %esp
movl $0, -4(%ebp)
jmp .L2
.L3:
addl $1, -4(%ebp)
.L2:
cmpl $4, -4(%ebp)
jle .L3
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.6.2 20111027 (Red Hat 4.6.2-1)"
.section .note.GNU-stack,"",@progbits
但是,当我使用
gcc -x c++ -m32 -S -O0 -o main.s main.c
时除了这些行,我得到相同的输出:.L2:
cmpl $4, -4(%ebp)
setle %al
testb %al, %al
jne .L3
我的问题是:为什么它使用
setle
和 testb
而不是 jle
在 C++ 代码中?它更有效吗?附言另外,有没有办法摆脱这些
.cfi_*
汇编输出中的指令?
最佳答案
好吧,您使用的是不同的编译器,因此获得不同的输出并不奇怪。 clang
在将程序编译为 C 或 C++ 时,确实会给出完全相同的结果,如果您感兴趣的话:
$ cp example.c example.cpp
$ clang -o exampleC example.c
$ clang++ -o exampleC++ example.cpp
$ otool -tV exampleC > C
$ otool -tV exampleC++ > C++
$ diff C C++
1c1
< exampleC:
---
> exampleC++:
$
我从
gcc
得到相同的结果和 g++
在我的机器上也是如此,所以看起来这只是您特定编译器版本的一个怪癖。
关于gcc - "gcc -x c"和 "gcc -x c++"汇编输出的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338164/