2014-10-27 7 views
5

Nel nostro progetto ci sono un sacco di funzioni in cui sono passati stringhe tramite copia:Il passaggio di std :: string via copia sarà ottimizzato?

void f(std::string a); 

Come tutti sappiamo che è più efficace di passare per riferimento, ma il mio collega dice che il compilatore di ottimizzare comunque. Questo è vicino alla verità per GCC?

G ++ 4.8.2, -O2 abilitato in Versione di rilascio.

Grazie!

+1

È possibile controllarlo in qualsiasi momento scaricando l'assieme generato (flag '-S'). –

+0

'-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. –

risposta

6

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.

+1

Solo un'aggiunta: se il codice può essere utilizzato in seguito con altri compilatori, fai ciò che è garantito per funzionare ovunque, qui usa il buon vecchio 'const &' –

+0

Questa è una risposta corretta e buona, ma vorrei appoggiarmi molto più fortemente sul lato di scoraggiare fortemente questa pratica. Sì, possiamo dire che, in teoria, questo può essere ottimizzato ma può essere sempre veloce quanto 'const &' sarebbe e spesso non sarà così veloce. Leggendo ulteriormente in questo, questo è un trucco comune che le persone hanno iniziato ad usare per evitare di dover scrivere sia una versione "const" che "&&" di ogni funzione, ma dubito della necessità di un overload "&&" a meno che la profiling non indichi che è un collo di bottiglia. – sjdowling

+0

come fai a sapere tutto questo? :) leggi tutti gli articoli, i libri, le notizie sul C++? – Juster

Problemi correlati