簡體   English   中英

結構中向量內字符串切片的 Rust 生命周期

[英]Rust lifetime of string slices within a vector within a struct

在編寫我的程序時,我遇到了一個包含字符串向量的結構。 我對 Rust 的(基本)知識讓我想知道Vec<&str>是否在這樣的結構中:

struct StrSliceVector<'a> {
    v: Vec<&'a str>
}

(與結構密切相關的生命周期)比這個更有效或分配更少的堆內存:

struct StringVector {
    v: Vec<String>
}

我想,由於在StringVector中, String是在堆中分配的,因此它會產生一個向量(也在堆中),其中包含指向具有實際字符串的其他內存位置的指針。 StrSliceVector是否在內部將字符串分配給向量堆空間?

創建Vec<String>時,您必須決定是要將現有String移入向量中,還是將它們clone進去。如果將它們移入,則不需要額外的堆分配,因此總堆分配與Vec<&'a str>從這個角度來看。 哪個更合適取決於您的用例。 你想對向量的元素做什么?

如果您不要求對要執行的操作擁有向量中的字符串的所有權,則字符串切片版本應該是您的第一直覺,因為這意味着字符串仍然可用於在代碼中的其他地方進行操作,在向量已被掉了。

&str占用兩個usize內存(不包括其引用的字符串數據),而String占用三個usize 但是,如果這對您很重要,那么您可以將String替換為Box<str>以獲得與&str相同的大小,就像擁有的版本一樣。 然后你回到簡單地查看“擁有”與“借用”的邏輯差異。

&str僅引用現有數據,而String擁有其數據。 String版本比&str占用更多內存的唯一原因是如果字符串已經在其他地方擁有:例如,在另一個結構中或來自字符串文字。 如果是,那么您只是在復制已經存在的內容,因此會使用更多內存。 如果您想要一個可以處理擁有和借用數據的數據類型以節省分配,請考慮使用Cow

StrSliceVector是否在內部將字符串分配給向量堆空間?

兩者都是&strString相似,就地它們基本上只是指針; 數據將始終存在於其他地方,而不是與Vec元素一致。

因此,從廣義上講, &str會更節省空間,但生命周期會引入更多約束,這可能會使StrSliceVector<'a>不可行,具體取決於您打算如何使用它。 由於引用不擁有它們的數據,因此只要您使用向量,您必須確保擁有字符串的任何內容都可以使它們保持活動狀態。

暫無
暫無

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

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