簡體   English   中英

std :: string vs. char *

[英]std::string vs. char*

std :: string存儲數據的方式與堆棧或堆上的char *不同,還是只是從char *派生到類中?

char*

  • 是您的CPU架構的一個指針的大小。
  • 可以是從malloccallocnewnew[]返回的值。
    • 如果是這樣,必須在完成后傳遞給freedeletedelete[]
    • 如果是這樣,則字符存儲在堆上。
  • 可能是由char[ N ] (常數N)數組或字符串文字的“分解”引起的。
    • 通常,無法判斷char*參數是否指向堆棧,堆或全局空間。
  • 不是班級類型。 它參與表達式但沒有成員函數。
  • 然而,實現RandomAccessIterator接口以與<algorithm>等一起使用。

std::string

  • 幾個指針的大小,通常是三個。
  • 創建時構造自身:不需要newdelete
    • 如果字符串可能被更改,則擁有該字符串的副本。
    • 可以從char*復制此字符串。
    • 默認情況下,內部使用new[]就像獲取char*
  • 提供隱式轉換,使char*或literal透明化。
  • 是一種類型。 為表達式定義其他運算符,例如catenation。
    • 定義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.

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