У меня есть следующий код в файле 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-bit), я получаю такой вывод:
.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 ++? Это более эффективно?
P.S. Кроме того, есть ли способ избавиться от этих директив .cfi_*
в выводе сборки?