Разница между выводом сборки "gcc -x c" и "gcc -x c ++" - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть следующий код в файле 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_* в выводе сборки?

1 Ответ

2 голосов
/ 18 февраля 2012

Ну, вы используете другой компилятор, так что не удивительно, что вы получаете другой вывод.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++ намоя машина, так что, похоже, это просто причуды вашей конкретной версии компилятора.

...