2010-07-23 14 views
16

Nella sezione 7.1.1 del libro "The C++ Programming Language", afferma l'autore:Le funzioni in linea hanno indirizzi?

"funzione inline ha ancora un indirizzo univoco e così fanno le variabili statiche di una funzione inline"

Sono confuso . Se ho una funzione inline, non può avere un indirizzo. Questo succede anche in C?

+1

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? –

+0

Quale edizione? Sto guardando la terza edizione e non riesco a vedere dove lo dice. – Clifford

+2

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

risposta

34

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()).

+1

+1. Risposta molto bella. – ereOn

3

L'espansione in linea della funzione non ha un indirizzo, ma se quella funzione ha una variabile statica, la variabile ha un indirizzo. Una variabile statica è in pratica solo una variabile globale il cui nome è visibile solo localmente (ad esempio, nell'ambito dell'ambito in cui è definito). Altre variabili in una funzione inline potrebbero essere allocate nello stack (come sarebbero se non fossero espanse in linea) o potrebbero semplicemente vivere in registri macchina. La parte importante è che sono ancora variabili separate e devono agire come se la funzione non fosse stata espansa in linea (a differenza, ad esempio, delle macro, in cui è necessaria un'estrema cura per evitare che più valutazioni possano causare problemi).

5

Le funzioni in linea hanno indirizzi se ne avete bisogno. Standard dice solo che:

una funzione inline con esterno collegamento deve avere lo stesso indirizzo in tutte le unità di traduzione.

+0

È una forma di realizzazione o relativa alla regola "" come se "*? – jww

0

Possono essere in linea in determinati siti di chiamata ma esistono ancora come funzione normale nello spazio indirizzo.

0

Penso che tu stia confondendo la posizione del codice oggetto funzioni integrate, con le implicazioni dell'inlining. In genere visualizziamo le funzioni integrate come posizionate all'interno della funzione chiamante al livello del codice sorgente. Quello che il libro dice è che i nomi delle variabili, incluso l'uso di statiche all'interno delle funzioni inline, sono trattati come se la funzione fosse in realtà la tipica funzione autonoma.

Inoltre, il trattamento delle funzioni con la parola chiave inline, non garantisce che saranno in linea e, nei casi in cui non è possibile (come quando si richiede un indirizzo), verrà generata una versione non inline.

5

Non c'è alcuna contraddizione. Nelle parti in cui viene chiamata una funzione inline, il suo codice può essere inlineato. Nelle parti in cui si utilizza un puntatore per funzionare, è possibile creare una versione non in linea per disporre di un indirizzo.

Problemi correlati