[英]Length of a C string: std::strlen() vs. std::char_traits<char>::length()
[英]std::string vs. char*
std :: string存儲數據的方式與堆棧或堆上的char *不同,還是只是從char *派生到類中?
char*
malloc
或calloc
或new
或new[]
返回的值。
free
或delete
或delete[]
。 char[ N ]
(常數N)數組或字符串文字的“分解”引起的。
char*
參數是否指向堆棧,堆或全局空間。 <algorithm>
等一起使用。 std::string
new
或delete
。
char*
復制此字符串。 new[]
就像獲取char*
。 char*
或literal透明化。 c_str()
,它返回一個char*
供臨時使用。 begin()
和end()
實現std::string::iterator
類型。
string::iterator
非常靈活:一個實現可以使它成為一個范圍檢查的超級安全調試助手,或者只是一個交換機翻轉時的超高效char*
。 如果你的意思是,它是否連續存儲,那么答案是它不是必需的,但所有已知的(對我而言)實現都這樣做。 這很可能支持c_str()
和data()
成員要求,即返回連續的字符串(在c_str()
的情況下以null結尾)
就存儲器的存儲位置而言,它通常在堆上。 但是一些實現采用“短字符串優化”,其中短字符串內容存儲在小的內部緩沖區中。 因此,在字符串對象在堆棧上的情況下,存儲的內容也可能在堆棧上。 但這對你如何使用它沒有任何影響,因為一個對象被破壞,存儲字符串數據的內存在任何一種情況下都是無效的。
(順便說一下,這里有一篇關於類似技術的文章 ,它解釋了優化。)
這解決了不同的問題。 char*
(或char const*
)指向C樣式字符串,該字符串不一定由存儲char*
指針的字符串所擁有。 在C中,由於缺少字符串類型,您必須經常使用char*
作為“字符串類型”。
std::string
擁有它指向的字符串數據。 因此,如果您需要在類中的某個位置存儲字符串,那么您可能希望使用std::string
或librarie的字符串類而不是char*
。
關於std::string
存儲的連續性,其他人已經回答了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.