I riferimenti vengono convertiti in puntatori dal compilatore, quindi in fase di esecuzione non c'è differenza di velocità. La velocità non è la ragione per cui scegli i riferimenti anziché i puntatori, ma in realtà i riferimenti potrebbero essere un po 'più veloci nel tuo codice generale semplicemente perché non hai bisogno di controllare costantemente i riferimenti non validi (puntatori NULL).
Se a è una piccola variabile (non più grande della dimensione dell'indirizzo della macchina), allora non c'è differenza tra a e & a . Se a è più grande della dimensione dell'indirizzo della macchina (es. Un oggetto di classe) allora & a è più veloce e & a deve essere fatto ( piuttosto che a ).
Ovviamente devi considerare se vuoi essere in grado di modificare un nella funzione chiamata. Se a è grande e vuoi proibire il cambio di a, passa un riferimento costante a a.
Se usi C ++, dovresti sempre usare riferimenti quando possibile. Un buon libro in C ++ indicherà quale sia la differenza tra riferimenti e puntatori. Dovresti considerare quanto segue:
I riferimenti sono implementati sotto come puntatori. Allora perché usare un riferimento? Perché consente allo scrittore di funzioni di determinare come funziona una funzione senza influire sul modo in cui viene chiamata. Con i riferimenti, il chiamante di una funzione non ha bisogno di sapere se la funzione accetta un puntatore o l'oggetto stesso. Ad esempio, chiamate le 2 funzioni seguenti nello stesso modo e notate che possiamo modificare add1 per usare i riferimenti senza influire su tutti i chiamanti:
int add1 (int a, int b);
int add2 (int &a, int &b) {
// this actually gets converted by the compiler to
// *a + *b
return a + b;
}
Se stavi usando i puntatori, dovresti sapere che la funzione sta effettivamente prendendo l'indirizzo, non l'oggetto stesso. In altre parole, i riferimenti si aggiungono all'hiding delle informazioni.
Quindi, per riassumere, i riferimenti sono solo zucchero sintattico. Il compilatore convertirà tutti i riferimenti a puntatori e operazioni in riferimenti a operazioni valide con / su puntatori.
In secondo luogo, a differenza dei puntatori - un riferimento è l'oggetto. Con i puntatori, è possibile modificare l'oggetto puntato o è possibile modificare il puntatore stesso (nel qual caso indicherà qualcos'altro). Con un riferimento c'è solo una cosa che puoi cambiare: l'oggetto di riferimento.
Terzo, i riferimenti non possono essere riassegnati per fare riferimento a un altro oggetto come un puntatore. Spesso, nelle liste collegate devi spostare i puntatori avanti / indietro. Non puoi farlo con un riferimento. Pensa a un riferimento come un alias a un oggetto.
Infine, riguardo al NULL ... nel codice C vedrai molto del controllo del puntatore NULL. I riferimenti hanno lo scopo di aiutare con ciò consentendo al compilatore di catturare ogni volta che un riferimento non fa riferimento a un oggetto valido. Lo standard C ++ dice anche che un riferimento non può puntare a un oggetto non valido (ad esempio un NULL). Tuttavia, penso che dipenda dal compilatore su come implementa questo, quindi è necessario ricontrollare il compilatore. Penso che alcuni compilatori non ti avvertiranno nemmeno.