Teoricamente quelli senza di riferimento potrebbero essere copiati in memoria in quanto vi è la possibilità che la funzione in linea possa modificarli (anche se in realtà non lo è).
In molti casi il compilatore è abbastanza intelligente da selezionare quel tipo di cose ma dipenderà dal compilatore e dalle impostazioni di ottimizzazione. Inoltre, se la funzione richiama qualsiasi funzione membro non const nelle variabili di classe, il compilatore dovrà essere abbastanza intelligente da controllare se sta modificando anche qualcosa.
Utilizzando un riferimento const si può sostanzialmente dare un'indicazione abbastanza chiara.
MODIFICA: Ho solo dato un'occhiata al codice macchina per un semplice test program compilato con GCC 4.6 in ddd. Il codice generato sembrava identico, quindi sembra essere ottimizzato. È comunque buona pratica per altri compilatori e se nient'altro fornisce una chiara indicazione sull'intento del codice. È anche possibile che ci siano situazioni più complesse che il compilatore non può ottimizzare.
Anche lo llvm online dissembler demo mostra il codice bit identico viene generato anche lì. Se disattivi l'ottimizzazione, è leggermente più lungo senza il riferimento const.
* 1964 byte - Nessun riferimento const (e nessun altro comando su funzioni/parametri)
* 1960 byte - Solo nessun riferimento const, ma altri consts.
* 1856 byte - Con riferimento a const e const.
fonte
2011-10-02 14:16:39
Un valore è un valore e un riferimento è un riferimento.Passare un riferimento const quando il significato invece di passare un valore è un errore che può mordere male. Vedi http://stackoverflow.com/questions/4705593/int-vs-const-int/4705871#4705871 – 6502
@ 6502: questo è un ottimo esempio di caso in cui l'utilizzo di un riferimento rende la logica più complicata ('v.push_back (v [0]) 'è legale, perché la libreria standard deve includere quella logica extra). –
@ BenVoigt: bello vedere questa richiesta è stata aggiunta allo standard. Dove è dichiarato? – 6502