L'attributo inline
è solo un suggerimento al compilatore che dovrebbe provare a integrare la funzione. È ancora possibile prendere l'indirizzo della funzione, e in tal caso il compilatore dovrà anche emettere una versione non in linea.
Ad esempio:
#include <stdio.h>
inline void f() {
printf("hello\n");
}
int main() {
f();
void (*g)() = f;
g();
}
Le stampe di codice di cui sopra hello
due volte.
mio gcc
compilatore (con -O
) emette il codice simile al seguente:
_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
Come si può vedere, c'è prima una chiamata al puts()
e poi una chiamata a L__Z1fv()
(che è il nome storpiato di f()
).
fonte
2010-07-23 13:03:03
Penso che la frase abbia bisogno di più contesto. "la funzione inline ha ancora una variabile unica" non ha senso. Perché non pensi che una funzione inline possa avere un indirizzo? –
Quale edizione? Sto guardando la terza edizione e non riesco a vedere dove lo dice. – Clifford
Citazione accurata dal libro: "In particolare, una funzione inline ha ancora un indirizzo univoco e quindi le variabili statiche di una funzione inline". Questa è l'ultima cosa nella sezione 7.1.1 - il paragrafo precedente inizia con "Lo specificatore in linea è un * suggerimento * per il compilatore" (mia enfasi). Le variabili statiche sono trattate nella sezione 7.1.2 – Steve314