2016-12-27 18 views
5

Czy poniższe wyrażenie tworzy kolejny ciąg std ::, a następnie dodaje go do s1?Czy wyrażenie "std :: string + char" tworzy kolejny ciąg std :: string?

std::string s1 = "abc", s2 = "xyz"; 
    s1 += s2 + 'b'; 

Czy zapobiegnie to sytuacji (zostaną dodane do s1 bez dodatkowej pracy)?

std::string s1 = "abc", s2 = "xyz"; 
    s1 += s2; 
    s1 += 'b'; 

Czy te zasady mają zastosowanie również w wyrażeniach "std :: string + std :: string"?

+5

Twój tytuł pytania nie pasuje do szczegółów pytania. – Brian

+1

Są równie szybkie. Bez różnicy. –

+6

"Napraw" za co? Jaki jest problem? Również stos/sterty są mylące/niepoprawne/nieistotne, szczególnie, ponieważ 'std :: string' dynamicznie przydziela swój bufor. –

Odpowiedz

4

Wszystkie przeciążone + operatorów udziałem std::string zwrot nowa std::string obiektu. Jest to nieunikniony wniosek, który osiągniesz, gdy you finally decipher the relevant documentation.

Jako taki, w pierwszym przykładzie twojego pytania operator + zwróci obiekt tymczasowy, który zostanie zniszczony po zakończeniu natychmiastowej operacji +=.

Powiedziawszy to: kompilator C++ może stosować dowolną optymalizację, która daje identyczne obserwowalne wyniki. Możliwe, że kompilator C++ zdaje sobie sprawę, że możliwe jest uniknięcie potrzeby utworzenia obiektu tymczasowego przez przekształcenie pierwszej wersji kodu na drugą. Nie sądzę, że to bardzo prawdopodobne, ale jest to możliwe. Nie ma zauważalnych różnic w wynikach między dwiema wersjami kodu, więc optymalizacja jest dozwolona.

Ale, technicznie, operacja + tworzy tymczasowy obiekt std::string.

0

W zależności od kontekstu. W Twoim fragmencie kodu nie będzie już innego obiektu, do którego zostanie dodany i 'b' do już istniejącego s1.

http://www.cplusplus.com/reference/string/string/operator+=/

Na przykład w tym przypadku:

std::string s1 = "abc"; 
std::string s2 = "zxy"; 
std::string result = s1 + s2; 

result jest nowy obiekt złączenie s1 i s2

+3

Czy jesteś pewien? 's2 + 'b'' wygląda dla mnie jako odrębny, tymczasowy' std :: string'. Prawdziwą odpowiedzią jest "kogo to obchodzi", ponieważ w najgorszym razie tymczasowe przeniesienie do "s1". –

+0

@LightnessRacesinOrbit: yes utworzy tymczasowy obiekt, który konstruktor przyjmuje pojedynczy znak – Raindrop7

+3

Ta składnia to "inicjalizacja kopii", więc 'result' to (C++ 03: copy, C++ 11 i nowsze: move) nowego tymczasowego obiektu łączącego 's1' i' s2'. –