PDA

View Full Version : [C++]Inline


Gogeta ss4
20-05-2004, 15:45
Raga non riesco a capire a cosa serve e come si usa la INLINE

Chi mi può spiegare in poche parole a cosa serve e come si usa con un piccolo esempio comprensibile?? :D

Grazie in anticipo

kingv
20-05-2004, 16:12
inline e' un "invito" che fai al compilatore nel trattare una funzione.
Gli chiedi in particolare di sostituire una chiamata a una funzione (quella dichiarata inline) con il codice della funzione stessa.

A fronte di una dimensione maggiore dell'eseguibile riduci il (piccolo) overhead dovuto alla chiamata a una funzione.

Gogeta ss4
20-05-2004, 16:52
ma il codice della funzione lo metto nel prototipo?

es:

inline float cubo(float s) { return s*s*s;}

Perchè la definizione della funzione la mette dove c'è il prototipo??

kingv
20-05-2004, 17:11
Originariamente inviato da Gogeta ss4

Perchè la definizione della funzione la mette dove c'è il prototipo??



per le funzioni inline puoi farlo, anzi mi sembra che anche se non la dichiari esplicitamente se definisci un metodo di una classe nella definizione della classse sia inline di default....

puoi dichiarare inline sia metodi di una classe che funzioni.

come ti dicevo prima inline e' un suggerimento per il compilatore, naturalmente puo' ignorarlo (pensa se chiamassi la funzione inline dentro un ciclo for ;) )

Gogeta ss4
20-05-2004, 17:20
ok grazie

Volevo chiederti un altra cosa

Quando uso il passaggio per indirizzo il prototipo è così:

int cubo(int *);

o

int cubo(int & ) ; ???

kingv
20-05-2004, 17:24
nel passaggio per indirizzo usi la prima notazione, la seconda e' detta "passaggio per riferimento" ;)

Gogeta ss4
20-05-2004, 17:31
ma il passaggio di riferimento non è uguale a passaggio per indirizzo??

bizzu
20-05-2004, 20:15
No è meglio.
Nel passaggio per indirizzo, all'interno della funzione devi usare la sintassi dei puntatori.
Nel passaggio per riferimento (introdotto dal C++) la tratti come una variabile qualsiasi. Una gran comodità e inoltre aiuta ad evitare errori coi puntatori.
;)

cionci
20-05-2004, 21:10
Dal punto di vista della traduzione effettuata dal compilatore in linguaggio macchina il passaggio per riferimento e quello per indirizzo sono di fatto identici...

L'unica differenza è che quello per indirizzo è più comodo in fase di scrittura del programma...

Gogeta ss4
20-05-2004, 23:13
Ok, grazie

Un ultima cosa, nei template quando li definisco e scrivo: template<class T>

Al posto di t posso mettere quello che voglio??

Anche I etc etc ??

cionci
21-05-2004, 02:17
Sì ;)

/\/\@®¢Ø
21-05-2004, 08:37
Originariamente inviato da Gogeta ss4
ma il passaggio di riferimento non è uguale a passaggio per indirizzo??
Molto simili ma non identici.
Da un lato il puntatore e' piu' comodo quando devi cambiare l'oggetto a cui ti riferisci: la sintassi da usare risulta piu' chiara e non sei tenuto ad assegnare il riferimento da subito (non hai "riferimenti a NULL", non direttamente perlomeno). Dall'altra il riferimento, proprio perche' un po' piu' limitato, puo' essere rielaborato in modo piu' libero dal compilatore cosicche' viene ottimizzato di piu'.
Ad esempio se io scrivo

const int& x = y + 3;
const int& z = x * 4;
cout << z << endl;

il compilatore non andra' a creare fisicamente le variabili x e z, sostituira il loro valore nella terza riga. La cosa puo' apparire banale, ma funziona anche con espressioni piu' complesse e puo' risultare comodo per renderle piu' leggibili senza rallentare il codice.

cavay
22-05-2004, 19:33
Originariamente inviato da cionci
Dal punto di vista della traduzione effettuata dal compilatore in linguaggio macchina il passaggio per riferimento e quello per indirizzo sono di fatto identici...

L'unica differenza è che quello per indirizzo è più comodo in fase di scrittura del programma...

Corregetemi se sbaglio ma...esiste anche un'altra differenza, nel caso di passaggio per indirizzo, nella chiamata a funzione viene cmq fatto una copia (quella del puntatore) cosa che nel secondo caso nn succede. se nn sono stato chiaro abbrevio in il passaggio per indirizzo significa un passag per valore di un punatore mentre per riferimento si innesca un comportamento particolare, che nn sto qui a spiegare, in base al quale si riesce a nn fare nessuna copia.

cionci
22-05-2004, 20:49
Che io sappia il comportamento è identico...
Utilizzavamo un porting del gcc per Windows (djgpp)...ed dal punto di vista delle istruzioni assembler mi ricordo che erano esattamente la stessa identica cosa...

/\/\@®¢Ø
22-05-2004, 21:17
Originariamente inviato da cavay
Corregetemi se sbaglio ma...esiste anche un'altra differenza, nel caso di passaggio per indirizzo, nella chiamata a funzione viene cmq fatto una copia (quella del puntatore) cosa che nel secondo caso nn succede. se nn sono stato chiaro abbrevio in il passaggio per indirizzo significa un passag per valore di un punatore mentre per riferimento si innesca un comportamento particolare, che nn sto qui a spiegare, in base al quale si riesce a nn fare nessuna copia.
Quel che dici e' in parte vero, nel senso che l'implementazione banale del riferimento e' quella del puntatore mascherato ma non l'unica. Volendo si puo' gestire il riferimento in modo un po' differente cosi' da poterlo ottimizzare meglio in fase di inlining, in particolare nel caso di riferimenti costanti.
Ad esempio la classica funzione

template<typename T>
const T& max( const T& x , const T& y )
{ x<y ? y : x; }

puo' essere ottimizzata facilmente:

int a,b;
...
cout << max(a,b) << endl;

diventa qualcosa del tipo

int a,b;
...
cout << ( a < b ? b : a ) << endl;

Senza alcun riferimento a variabili intermedie.
Non che con i puntatori non sia possibile, ma comporta alcuni passaggi in piu' da eliminare da parte dell'ottimizzatore, cosi' che in alcuni casi si potrebbe generare codice un po' diverso (opinione personale questa... non e' affatto detto che sia proprio cosi' :p )