簡體   English   中英

std :: string是否需要將其字符存儲在連續的內存中?

[英]Does std::string need to store its character in a contiguous piece of memory?

我知道在C ++ 98中, std::basic_string<>std::vector<>都不需要使用連續存儲。 一旦被指出,這被視為對std::vector<>的疏忽,如果我沒記錯的話,用C ++ 03修復了。

似乎記得讀過有關討論要求std::basic_string<>在C ++ 11仍被稱為C ++ 0x時使用連續存儲,但我當時沒有密切關注討論,並且仍然局限於C ++ 03在工作,所以我不確定它是什么。

那么使用連續存儲需要std::basic_string<>嗎? (如果是這樣,那么標准的哪個版本首先需要它?)

如果您想知道:如果您將&str[0]的結果傳遞給期望連續寫入內存的函數,則這很重要。 (我知道str.data() ,但由於顯而易見的原因,舊代碼不使用它。)

C ++ 11標准 ,basic_string 21.4.1.5,

basic_string對象中的char類對象應連續存儲。 也就是說,對於任何basic_string對象,標識&*(s.begin()+ n)==&* s.begin()+ n應該適用於n的所有值,使得0 <= n <s.size ()。

在c ++ 03中,無法保證字符串的元素會被連續存儲。 [basic.string]是

  1. 對於類似char的類型charT,類模板basic_string描述了可以存儲由不同數量的任意類似char的對象組成的序列的對象(第21節)。 序列的第一個元素位於零位。 如果給定的類似char的類型從上下文中清楚,則這樣的序列也稱為“字符串”。 在本節的其余部分中,charT表示類似於char的類型。 通過作為模板參數傳遞的Allocator類,通過類basic_string的成員函數根據需要分配和釋放字符串的存儲。 Allocator :: value_type應與charT相同。
  2. 類模板basic_string符合Sequence的要求,如(23.1.1)中所述。 另外,因為basic_string支持的迭代器是隨機訪問迭代器(24.1.5),所以basic_string符合(23.1)中規定的可逆容器的要求。 389 ISO / IEC 14882:2003(E)ISO/ IEC 21.3類模板basic_string 21字符串庫
  3. 在所有情況下,size()<= capacity()。

然后在C ++ 17中他們也改變了它

  1. 類模板basic_string描述了可以存儲由不同數量的任意類似char的對象組成的序列的對象,其中序列的第一個元素位於零。 如果它所保持的類似char的對象的類型從上下文中清楚,則這樣的序列也稱為“字符串”。 在本條款的其余部分中,basic_string對象中保存的類似char的對象的類型由charT指定。
  2. basic_string的成員函數使用作為模板參數傳遞的Allocator類的對象來為包含的類似char的對象分配和釋放存儲。
  3. basic_string是一個連續的容器(23.2.1)。
  4. 在所有情況下,size()<= capacity()。

強調我的

所以預先C ++ 17它不能保證,但現在它是。

由於std::string::data強加的約束,這種非保證幾乎沒有用,因為調用std::string::data會給你一個連續的字符串數組。 因此,除非實現按需執行此操作,並且在恆定時間內字符串將是連續的。


如果您想知道:如果您將&str[0]的結果傳遞給期望連續寫入內存的函數,則這很重要。 (我知道str.data() ,但由於顯而易見的原因,舊代碼不使用它。)

operator[]的行為也發生了變化。 在C ++ 03中我們有

返回:如果pos <size(),則返回data()[pos]。 否則,如果pos == size(),則const版本返回charT()。 否則,行為未定義。

因此,如果在s為空時嘗試&s[0] ,則只保證const版本具有已定義的行為。 在C ++ 11中,他們將其更改為:

如果pos <size(),則返回: *(begin()+ pos)。 否則,返回對charT類型的對象的引用,其值為charT(),其中修改對象會導致未定義的行為。

所以現在,當s為空時,如果你嘗試&s[0] ,那么const和非const版本都有定義的行為。

根據草案標准N4527 21.4 / 3類模板basic_string [basic.string]

basic_string是一個連續的容器(23.2.1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM