2016-12-27 118 views
5

以下表達式是否創建另一個std :: string,然後將其添加到s1?「std :: string + char」表達式是否創建另一個std :: string?

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

它應該防止這種情況(他們會被添加到s1沒有額外的工作)?

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

這些規則是否也適用於「std :: string + std :: string」表達式?

+5

您的問題標題與問題詳細信息不符。 – Brian

+1

這些速度同樣快。沒有不同。 –

+6

「修復」是什麼?問題是什麼?另外,stack/heap在這裏誤導/錯誤/無關,特別是因爲'std :: string'動態分配它的緩衝區。 –

回答

4

所有重載+運營商涉及std::string返回一個新std::string對象。這是當you finally decipher the relevant documentation時你將達到的不可避免的結論。

因此,在您的問題的第一個示例中,+運算符將返回一個臨時對象,該對象在緊隨其後的+=操作完成後將被銷燬。

話雖如此:C++編譯器被允許採用任何優化,產生相同的可觀察結果。 C++編譯器很可能會發現,通過將第一版本的代碼轉換爲第二版本,本質上可以避免創建臨時對象。我不認爲這很可能,但這是可能的。兩個版本的代碼之間的結果沒有明顯的差異,所以優化是公平的遊戲。

但是,從技術上講,+操作會產生一個臨時對象std::string

0

取決於上下文。在您的代碼片段中不會有另一個對象,s2'b'將被附加到已有的s1

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

例如,在這種情況下:

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

result是新對象級聯s1s2

+3

你確定嗎? 's2 +'b''看起來像一個截然不同的,臨時的'std :: string'給我。真正的答案是「誰在乎」,因爲在最糟糕的情況下,臨時會轉移到「s1」。 –

+0

@LightnessRacesinOrbit:yes它會創建一個臨時對象,其構造函數採用單個字符 – Raindrop7

+3

該語法是「複製初始化」,所以'result'是一個(C++ 03:copy,C++ 11及更高版本:移動)連接's1'和's2'的新臨時對象。 –

相關問題