3 回答

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

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