Атрибут inline
является просто подсказкой для компилятора, что он должен попытаться встроить вашу функцию. Все еще возможно взять адрес функции, и в этом случае компилятору также потребуется испустить не встроенную версию.
Например:
#include <stdio.h>
inline void f() {
printf("hello\n");
}
int main() {
f();
void (*g)() = f;
g();
}
Приведенный выше код печатает hello
дважды.
Мой gcc
компилятор (с -O
) выдает код примерно так:
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
call ___i686.get_pc_thunk.bx
"L00000000002$pb":
leal LC0-"L00000000002$pb"(%ebx), %eax
movl %eax, (%esp)
call L_puts$stub ; inlined call to f()
call L__Z1fv$stub ; function pointer call to f() (g is optimised away)
movl $0, %eax
addl $20, %esp
popl %ebx
popl %ebp
ret
Как видите, сначала вызывается puts()
, а затем L__Z1fv()
(искаженное имя f()
).