亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C ++ 11中string :: c_str()不再為null終止嗎?

在C ++ 11中string :: c_str()不再為null終止嗎?

C++
開心每一天1111 2019-12-03 15:07:07
在C ++ 11中,basic_string::c_str它定義為與完全相同basic_string::data,而后者又定義為*(begin() + n)與和*(&*begin() + n)(when 0 <= n < size())完全相同。我找不到任何要求字符串末尾始終包含空字符的內容。這是否意味著c_str()不再保證生成以null終止的字符串?
查看完整描述

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());這也意味著即使終止符被延遲初始化,也無法觀察中間狀態的緩沖區。


查看完整回答
反對 回復 2019-12-03
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

“歷史”是很久以前,當每個人都在單個線程中工作,或者至少線程是擁有自己數據的工人時,他們為C ++設計了一個字符串類,該類使字符串處理比以前更容易,并且它們重載了運算符+連接字符串。


問題是用戶將執行以下操作:


s = s1 + s2 + s3 + s4;

并且每個串聯都會創建一個臨時對象,該臨時對象必須實現一個字符串。


因此,有人會產生“惰性評估”的頭腦,以便在內部可以將所有字符串存儲在某種“繩子”中,直到有人想要將其讀取為C字符串為止,此時您可以將內部表示形式更改為連續的緩沖區。


這解決了上述問題,但引起了其他麻煩,特別是在多線程世界中,人們期望.c_str()操作為只讀/不會更改任何內容,因此不需要鎖定任何內容。在類實現中過早地進行內部鎖定,以防萬一有人對它進行多線程處理(甚至在沒有線程標準的情況下)也不是一個好主意。實際上,做任何事情都比每次簡單地復制緩沖區要昂貴得多。字符串實現放棄了“寫時復制”實現的相同原因。


因此,做.c_str()一個真正不變的操作被認為是最明智的選擇,但是現在可以“依賴”線程感知的標準嗎?因此,新標準決定明確聲明您可以,因此內部表示形式必須包含空終止符。


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 936 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號