W tym konkretnym przypadku, zakładając C++ 11 i przenieś konstrukcję/przypisanie dla łańcuchów, powinieneś przyjąć argument według wartości i przenieść do członka dla konstruktora.
A::A(string str) : mStr(std::move(str)) {}
Przypadek seter jest nieco trudniejsze i nie jestem pewien, czy naprawdę chcesz/potrzeby, aby zoptymalizować każdy kawałek to ... Jeżeli chcesz zoptymalizować najbardziej można dostarczyć dwa przeciążeń, jeden przyjmowanie wartości odniesienia rvalue, a innego przyjmowanie wartości stałej constal. W każdym razie, const odniesienia lwartość jest chyba wystarczająco dobre podejście:
void A::setString(string const& str) { mStr = str; }
Dlaczego różnica?
W przypadku konstruktora członek nie jest jeszcze zbudowany, więc będzie musiał przydzielić pamięć. Możesz przenieść tę alokację pamięci (i faktyczne kopiowanie danych, ale to jest koszt dzierżawy) do interfejsu, tak, że jeśli wywołujący ma tymczasowy, może być przekazany bez dodatkowej alokacji pamięci.
W przypadku zlecenia rzeczy są nieco bardziej skomplikowane. Jeśli bieżący rozmiar ciągu jest wystarczająco duży, aby pomieścić nową wartość, wówczas nie jest wymagana żadna alokacja, ale jeśli ciąg znaków nie jest wystarczająco duży, wówczas trzeba będzie ponownie przydzielić. Jeśli alokacja zostanie przeniesiona do interfejsu (argument wartości zależnej), zostanie wykonana zawsze, nawet jeśli jest niepotrzebna. Jeśli alokacja jest wykonywana wewnątrz funkcji (const reference argument), wówczas dla małego zestawu przypadków (tych, dla których argument jest tymczasowy, który jest większy niż bieżący bufor), zostanie wykonany alokacja, której w przeciwnym razie można by uniknąć.
Konstruktor jest lepszy średnio jak to, co masz z 'mStr (std :: move (str))'. Jeśli naprawdę potrzebujesz zoptymalizować go jeszcze bardziej, nadal możesz go przeciążać. – chris
Musisz wziąć kopię w każdym przypadku, prawda? –
@chris Myślę, że twój sposób 'move' działa również dla' setString'. Jeśli 'string' nie ma żadnego ruchu ctor i przypisania, który sposób jest lepszy? Dzięki. – user1899020