3 回答

TA貢獻1815條經驗 獲得超10個贊
現在需要字符串才能在內部使用以空值結尾的緩沖區??匆幌耾perator[](21.4.5)的定義:
要求: pos <= size()。
返回: *(begin() + pos)如果pos <
size(),否則返回對T帶有value 類型的對象的引用charT();參考值不得修改。
回顧c_str(21.4.7.1/1),我們看到它的定義是operator[]:
返回:指針,p這樣in 中p + i == &operator[](i)的每個指針。i[0,size()]
并且c_str和data都必須為O(1),因此有效地強制實現使用以空值結尾的緩沖區。
此外,正如DavidRodríguez-dribeas在評論中指出的那樣,返回值要求還意味著您可以&operator[](0)用作的同義詞c_str(),因此終止的空字符必須位于相同的緩沖區中(因為*(p + size())必須等于charT());這也意味著即使終止符被延遲初始化,也無法觀察中間狀態的緩沖區。

TA貢獻1863條經驗 獲得超2個贊
“歷史”是很久以前,當每個人都在單個線程中工作,或者至少線程是擁有自己數據的工人時,他們為C ++設計了一個字符串類,該類使字符串處理比以前更容易,并且它們重載了運算符+連接字符串。
問題是用戶將執行以下操作:
s = s1 + s2 + s3 + s4;
并且每個串聯都會創建一個臨時對象,該臨時對象必須實現一個字符串。
因此,有人會產生“惰性評估”的頭腦,以便在內部可以將所有字符串存儲在某種“繩子”中,直到有人想要將其讀取為C字符串為止,此時您可以將內部表示形式更改為連續的緩沖區。
這解決了上述問題,但引起了其他麻煩,特別是在多線程世界中,人們期望.c_str()操作為只讀/不會更改任何內容,因此不需要鎖定任何內容。在類實現中過早地進行內部鎖定,以防萬一有人對它進行多線程處理(甚至在沒有線程標準的情況下)也不是一個好主意。實際上,做任何事情都比每次簡單地復制緩沖區要昂貴得多。字符串實現放棄了“寫時復制”實現的相同原因。
因此,做.c_str()一個真正不變的操作被認為是最明智的選擇,但是現在可以“依賴”線程感知的標準嗎?因此,新標準決定明確聲明您可以,因此內部表示形式必須包含空終止符。
- 3 回答
- 0 關注
- 936 瀏覽
添加回答
舉報