In questo caso particolare, e presupponendo C++ 11 e sposta costruzione/assegnazione per le stringhe, è necessario prendere l'argomento per valore e spostare per il membro per il costruttore.
A::A(string str) : mStr(std::move(str)) {}
Il caso del setter è un po 'più complicato e io non sono sicuro se si vuole veramente/necessità di ottimizzare ogni bit di esso ... Se si desidera ottimizzare il massimo che potrebbe fornire due overload, uno prendendo un riferimento di rvalue e un altro prendendo un riferimento di const-value. In ogni caso, il riferimento lvalue const è probabilmente un buon approccio abbastanza:
void A::setString(string const& str) { mStr = str; }
Perché la differenza?
Nel caso del costruttore, il membro non è ancora stato creato, quindi sarà necessario allocare memoria. È possibile spostare l'allocazione di memoria (e la copia effettiva dei dati, ma questo è il costo del leaser) nell'interfaccia, in modo che se il chiamante ha un temporaneo può essere inoltrato senza un'assegnazione di memoria aggiuntiva.
In caso di assegnazione le cose sono un po 'più complicate. Se la dimensione corrente della stringa è abbastanza grande da contenere il nuovo valore, non è richiesta alcuna allocazione, ma se la stringa non è sufficientemente grande, sarà necessario riallocare. Se l'allocazione viene spostata nell'interfaccia (argomento per valore), verrà eseguita sempre anche quando non è necessario. Se l'allocazione viene eseguita all'interno della funzione (argomento di riferimento const), per un piccolo insieme di casi (quelli in cui l'argomento è un temporaneo che è maggiore del buffer corrente) verrà eseguita un'allocazione che altrimenti sarebbe stata evitata.
fonte
2013-09-06 14:21:58
Il costruttore è in media migliore di quello che si ha con 'mStr (std :: move (str))'. Se hai davvero bisogno di ottimizzarlo di più, puoi comunque sovraccaricarlo. – chris
Devi comunque prenderne una copia, vero? –
@chris Penso che il tuo metodo 'move' funzioni anche per' setString'. Se 'string' non ha ctor e assegnamento, qual è il modo migliore? Grazie. – user1899020