[英]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.