Newsgroup: it.comp.lang.c++
Titolo: a che serve inline?

Salve a tutti.
Volevo sapere quale e' il significato di inline
So che si puo' utilizzare come prefisso nella definizione
di una funzione, ma non so cosa faccia ne quale
sia la sua utilita'.
Grazie e ciao.
    Sprite



ipotesi:
int __errno; // Variabile globale all'interno del tuo programma...
int GetErrNo(void)
{
	return __errno;
}
ogni qualvolta tu chiameresti GetErrNo dal tuo programma
il compilatore ti genererà il codice relativo alla chiamata..
magari sprecando byte inutilmente
inline fa si che il compilatore non faccia la chiamata, ma sostituisca
il codice direttamente 
esempio non inline
x=GetErrNo();
tradotto in 
call GetErrNo
{
	mov eax, __errno
}
mov x, eax
chiamata inline
tradotto
mov eax, __errno
mov x, eax
ha risparmiato la call...
cod


inline, scusa se precisso, e' solo un suggerimento che dai al compilatore:
"sostituisci direttamente al posto della chiamata il corpo della
funzione/metodo".
In alcuni casi e' veramente disastroso che il compilatore prenda alla
lettera
quello che gli si sugerisce (nel caso di inline dico).
Esempio: funzioni o metodi ricorsivi.
Ciao
Gaetano.
-- 
Posted from 
dell-01.mm.eutelsat.org
 [194.214.173.17] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie mille per le risposte.
Ora e' molto piu' chiaro.
Se ho capito bene, in termini di memoria
inline e' vantaggioso quando il codice della funzione
e' piu' corto che la effettiva chiamata alla funzione,
oppure quando una funzione si utilizza una volta sola
(be... a quel punto perche' usare una funzione? :)
Parlando di funzioni che abbiano magari la sola
istruzione return o comunque poche istruzioni,
mi sembra di capire che una funzione inline sia
piu' veloce di una funzione non inline, perche'
si salta la fase di chiamata...
oppure questo guadagno in tempi e' sempre
trascurabile (o proprio non esiste)?
O magari dipende dallo specifico compilatore utilizzato?
(in questo caso se dovessi essere OT, mi scuso)
Altra domanda (ok ok, e' l'ultima :)
Essendo inline sono un "suggerimento", il compilatore
puo' riservarsi il diritto di non seguirlo, oppure lo
standard gli imporrebbe di applicarlo sempre
(e quindi e' il programmatore che deve stare attento
a casi come la ricorsione)?
ciao a tutti
    Sprite

 a casi come la ricorsione)?
Il compilatore non solo puo riservarsi il diritto di non
seguirlo, ma come ti ho gia detto qualche volta
deve assolutamente astenersi.
In realta' quando il compilatore decide di ignorare la inline allora la 
funzione va piu' giustamente chiamata "outlined inlines" e questo 
problema fu trattato tardi nel processo di standardizzazione.
Un casino che la meta' basta, se ti interessa approfondire 
leggiti l' Item 33 di Effective C++.


 a casi come la ricorsione)?
Il compilatore può compilare in linea quello che vuole e rifiutarsi di compilare
in linea quello che vuole. il compilatore MS, per esempio, compila fuori linea
(come chiamata) qualunque funzione, anche quelle dichiarate inline, se compili
in modalità debug e può rendere inlinea delle funzioni che non erano dichiarate
inline in modalità release con le ottimizzazioni abilitate.
Un'ultima nota: inline non significa che la funzione può essere o deve essere
compilata inline (da questo punto di vista è solo un suggerimento) ma significa
che la funzione è locale alla translation unit. In altre parole se la funzione è
definita in un header deve essere inline (i membri di classe se definiti insieme
alla classe sono inline per default). Se invece è dichiarata nell'header e
definita in un file .cpp allora non deve esserlo. Infine se NON è dichiarata
nell'header ma solo nel file .cpp e pertanto viene usata solo in questo (salvo
il fatto che dovrebbe essere dichiarata static) può essere o meno inline a
seconda di cosa vuoi "suggerire" al compilatore.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 maggiore del tempo di esecuzione della funzione stessa.
Quindi, ad esempio, se ho un metodo che abbia come implementazione solo
un return(qualcosa), è sempre meglio dichiararla inline?
Ciao,
Cecco

 wrote in message
news:3BC44F98...@tin.it...

Se la definisci nell'header devi dichiararla inline, se la definisci in un file
.cpp no. Come ti dicevo uase o meno inline non deve dipendere dal desiderio o
meno di avere la funzione inline (quello di fatto lo controlli con gli switch
del compilatore) ma piuttosto dal fatto che la definizione della funzione sia
locale o meno alla translation unit.



In questo caso si.
Ciao,
Nicola