2009-04-08 32 views

回答

15

運算符+字符串的結果是一個新的字符串。因此,在這個例子中

cout << "Some text" + s1 + "some more text\n"; 

在整個事情被寫入cout之前,會創建兩個新字符串(意味着內存分配)。在你的第一個例子中,所有東西都直接寫到cout中,沒有不必要的內存分配。

1

第二符連接送他們來清點,這是一個性能問題,可能相當大串大前的字符串。如果可以的話,你總是希望使用第一種形式。

2

是的,string operator+ (const char* lhs, const string& rhs)創建並返回一個未命名的臨時字符串對象。

cout << "Some text"調用的ostream &的ostream ::運算< <(爲const char * const的)並返回ostream的參考。

cout << "Some text" << s1 << "some more text\n"; 

是cout上ostream::operator<<("Some text").operator<<(s1).operator<<("some more text\n"),三個電話,稱運< <兩個不同的重載,這需要一個const* char* const運< <和運< <,需要一個const string&。沒有內存分配,唯一的複製是cout的緩衝區。

cout << "Some text" + s1 + "some more text\n"; 

ostream::operator<<(t1)臨時字符串對象,我會打電話T1,其中T1從::operator+ ("Some text", s1).operator+("some more text\n")臨時結果。 (請注意,第一個運算符+不是字符串的成員,而是命名空間範圍的op +(const char * const,const字符串&)。它返回一個字符串,所以第二個+「是string :: operator +(const char * const )。)

因此,在這段代碼中創建了兩個臨時字符串對象(然後被析構),這意味着兩個字符串的內部表示(所以兩個內存分配)和兩個拷貝兩個新分配的內存(除了。複製到COUT的緩衝區)

5

考慮以下幾點:

cout << "Some text" + " " + "some more text\n"; 

它不會做什麼 您認爲。運算符+並不總是意味着連接。

編輯:當應用於原始字符串時,operator +不會連接 - 它會將指針的地址添加到字符串中。結果幾乎保證是無稽之談,因爲它指向與任何原始字符串都沒有關係的內存區域。運氣好的話會讓你的程序崩潰。

編輯2:顯然,我犯了這個錯誤已經很長時間了。結果非常荒謬,編譯器拒絕編譯它。

+0

不要co Mark馬克,解釋它是增加了兩個指針。 – tpdi 2009-04-08 03:53:28

相關問題