簡體   English   中英

為什么 Rust 中的字符串文字是 &str 而不是 String?

[英]Why are string literals &str instead of String in Rust?

我只是問為什么 Rust 決定對字符串文字使用&str而不是String 是不是有可能生銹字符串文字只是自動轉換為String ,並把它放在堆,而不是把它入堆棧的?

要理解推理,請考慮 Rust 想成為一種系統編程語言。 一般來說,這意味着它需要(除其他外)(a)盡可能高效,(b)讓程序員完全控制堆內存的分配和釋放。 Rust 的一個用例是用於內存非常有限的嵌入式編程。

因此,Rust 不想在並非絕對必要的情況下分配堆內存。 字符串文字在編譯時是已知的,可以寫入可執行文件/庫的ro.data部分,因此它們不會消耗堆棧或堆空間。

現在,鑒於 Rust 不想在堆上分配值,它基本上被迫將字符串文字視為&strString擁有它們的值並且可以移動和刪除,但是如何刪除ro.data的值ro.data 你真的不能那樣做,所以&str是完美的選擇。

此外,將字符串文字視為&str (或更准確地說是&'static str )具有所有優點,但沒有任何缺點。 它們可以在多個地方使用,可以共享而不必擔心使用堆內存並且永遠不必刪除。 此外,它們可以隨意轉換為擁有的String ,因此始終可以將它們作為String使用,但您只需在需要時支付費用。

要創建String ,您必須:

  • 在堆上保留一個位置(分配),和
  • 將所需內容從只讀位置復制到新分配的區域。

如果像"foo"這樣的字符串字面量兩者都做,那么每個字符串實際上會被分配兩次:一次在可執行文件中作為只讀字符串,另一次在堆中。 您不能僅僅引用存儲在可執行文件中的原始只讀數據。

&str文字使您可以訪問最有效的字符串數據:啟動時出現在可執行映像中的數據,由編譯器與構成程序的指令一起放在那里。 它指向的數據沒有存儲在堆棧中,堆棧分配的只是指針/大小對,就像任何 Rust 切片的情況一樣。

"foo" desugar 變成現在拼寫為"foo".to_owned()會使其變慢且空間效率較低,並且可能需要另一種語法來獲得非分配&str 畢竟,您不希望x == "foo"分配一個字符串只是為了立即將其丟棄。 像 Python 這樣的語言通過使它們的字符串不可變來緩解這個問題,這允許它們緩存源代碼中提到的字符串。 在 Rust 中,改變String通常是創建它的重點,因此該策略不起作用。

暫無
暫無

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

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