[英]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
是否在內部將字符串分配給向量堆空間?
兩者都是&str
和String
相似,就地它們基本上只是指針; 數據將始終存在於其他地方,而不是與Vec
元素一致。
因此,從廣義上講, &str
會更節省空間,但生命周期會引入更多約束,這可能會使StrSliceVector<'a>
不可行,具體取決於您打算如何使用它。 由於引用不擁有它們的數據,因此只要您使用向量,您必須確保擁有字符串的任何內容都可以使它們保持活動狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.