Questo è un problema un po 'controverso.
In teoria, sì, è più probabile che il compilatore applichi determinate ottimizzazioni quando passa per valore. Chandler Carruth ha spiegato come funziona per LLVM nella sua nota fondamentale BoostCon 2013 Ottimizzazione delle strutture emergenti di C++(video)/(slides).
Il problema è che ci sono overheads per il passaggio al valore di cui il compilatore non è in grado di sbarazzarsi. Questo è vero anche quando si ha un compilatore C++ 11 conforme e un tipo mobile come std::string
. Herb Sutter ha discusso il problema di chiamare le convenzioni in particolare nel suo talk CppCon2014 Essentials of Modern C++ Style(slides). La sua conclusione è di farlo come hai imparato in C++ 98-school: usa const&
come impostazione predefinita per passare argomenti non banali.
Un altro grande argomento contro la convenzione del pass-by-value è che diventa molto difficile scrivere codice efficiente che fornisca una garanzia di sicurezza eccezionale: per ottenere efficienza, l'utente dovrà spostare la stringa nella funzione. Ma in tal caso, se la funzione lancia, la stringa è sparita per sempre.
Ovviamente si applica ancora la prima direttiva di ottimizzazione: in caso di dubbio, misurare. Esegui un profiler sul tuo codice reale per vedere quale funziona meglio per te.
È possibile controllarlo in qualsiasi momento scaricando l'assieme generato (flag '-S'). –
'-S' non è perfetto per la corrispondenza con la fonte. Può ottenere risultati annotati leggibili usando semplicemente '-c -g -O2' quindi eseguendo' objdump -Sl' sul file oggetto. Anche i flag del compilatore '-Wa, -ahl = something.s' funzionano ma non sono completi come objdump. –