G ++ не встроенные функции - PullRequest
       14

G ++ не встроенные функции

4 голосов
/ 23 октября 2011

Существует такой код:

int fun1(){
   return 2 + 3;
}

inline int fun2(){  
   return 4 + 5;
}

int main(){
    int a = fun1();
    int b = fun2();
    return 0;
}

и соответствующий код сборки:

    .file   "prog47.cpp"
    .text
.globl _Z4fun1v
    .type   _Z4fun1v, @function
_Z4fun1v:
.LFB0:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    movl    $5, %eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE0:
    .size   _Z4fun1v, .-_Z4fun1v
    .section    .text._Z4fun2v,"axG",@progbits,_Z4fun2v,comdat
    .weak   _Z4fun2v
    .type   _Z4fun2v, @function
_Z4fun2v:
.LFB1:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    movl    $9, %eax
    popl    %ebp
    ret
    .cfi_endproc
.LFE1:
    .size   _Z4fun2v, .-_Z4fun2v
    .text
.globl main
    .type   main, @function
main:
.LFB2:
    .cfi_startproc
    .cfi_personality 0x0,__gxx_personality_v0
    pushl   %ebp
    .cfi_def_cfa_offset 8
    movl    %esp, %ebp
    .cfi_offset 5, -8
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    _Z4fun1v
    movl    %eax, 12(%esp)
    call    _Z4fun2v        # why fun2 is called?
    movl    %eax, 8(%esp)
    movl    $0, %eax
    leave
    ret
    .cfi_endproc
.LFE2:
    .size   main, .-main
    .section    .note.GNU-stack,"",@progbits

Почему функция fun2 не является встроенной и вызывается как обычная функция?Я читал, что ключевое слово inline является лишь подсказкой для компилятора и не требует встроенной функции, однако определение fun2 настолько просто, что его можно встроить.Как заставить g ++ встроенных функций?

Ответы [ 3 ]

13 голосов
/ 23 октября 2011

Включить оптимизацию.Вот что вы получаете для функции main с -O2 (x86_64):

0000000000400560 <main>:
  400560:   31 c0                   xor    %eax,%eax
  400562:   c3                      retq   

Она не только встроенная, она удалена.

Без оптимизации компилятор намного меньшескорее всего встроенный.(Встраивание делает код более сложным для отладки, поэтому хорошей идеей будет иметь только очень умеренные уровни встраивания с опциями неоптимизации по умолчанию.)

6 голосов
/ 23 октября 2011

У GCC есть атрибут, который заставляет встраивание: всегда_инлайн

inline int fun2()  __attribute__((always_inline));
inline int fun2() {  
   return 4 + 5;
}

Заставит его работать при любых настройках оптимизации.

5 голосов
/ 23 октября 2011

inline является подсказкой компилятора . Компилятор может или не может фактически встроить ваш код.

...