In C++, i parametri delle funzioni (inclusi i membri dei metodi) possono essere passati:
Esempio:
void foo(int value); // per valore void foo(int* ptr); // per puntatore void foo(const int& ref); // per riferimento (ottimale per grandi oggetti!)
Quando si passa per riferimento è possibile implementare l'ottimizzazione (copy elision), e per grandi oggetti si raccomanda const &. Per i puntatori, controlla sempre per nullptr.
Qual è la differenza tra
const MyClass& objeMyClass objnei parametri della funzione?
Risposta:
const MyClass& non copia l'oggetto, ma fornisce solo accesso senza possibilità di modificarlo (ottimale per grandi oggetti). MyClass obj copia sempre, il che è oneroso per grandi dimensioni o in assenza di una copia corretta (ad esempio, deep copy non implementato).
void process(const std::string& s); // Non copia void process(std::string s); // Copia
Storia Nella libreria aziendale di strutture matematiche, un programmatore ha deciso di accelerare il lavoro passando grandi contenitori per valore. Questo ha causato costi sostanziali ad ogni chiamata di funzione — le prestazioni sono diminuite della metà.
Storia Nel modulo di gestione degli utenti sono stati usati puntatori senza controllo per
nullptr. A volte si verificavano crash casuali quando si accedeva a puntatori non validi, il debug ha richiesto mesi.
Storia Nel progetto di elaborazione delle immagini, alcune funzioni accettavano oggetti per valore, mentre altre per riferimento. Per una delle classi, non era stata implementata la deep copy, il che ha causato perdite di memoria e una condivisione implicita delle risorse dopo il passaggio per valore.