gpt4 book ai didi

rust - 为什么结构中的切片需要生命周期,而不是向量?

转载 作者:行者123 更新时间:2023-11-29 07:42:26 25 4
gpt4 key购买 nike

当我定义如下结构时:

struct Test<'a> {
a: &'a [i64],
b: Vec<i64>,
}

切片和向量都包含一个指针。为什么 slice 需要生命周期,而 vector 不需要?

最佳答案

向量拥有它的元素。这意味着 vector 负责分配和释放它指向的元素。矢量元素的生命周期与矢量本身的生命周期相同,因此无需为 Vec 指定生命周期。类型。

切片借用向量或数组的元素,这些元素可以静态或动态分配。切片必须指示借用元素的生命周期,以便编译器可以进行必要的安全检查。

另一种表达方式是比较两个选项之间的事件顺序。

对于向量:

  1. A Vec被分配。最初没有为元素分配存储空间(当 Vec 为空时)。
  2. 随着元素被添加到向量中,元素的存储从堆中分配。 Vec存储指向该存储的指针。
  3. 当向量被删除时,元素的存储首先被释放,然后是 Vec自身被释放。

对于切片:

  1. 静态或动态地为数组或元素向量分配了一些存储空间。
  2. 分配并初始化一个切片以引用此存储的部分或全部元素。切片存储指向第一个元素的指针。
  3. 当切片被删除时,元素的存储不会被释放,因为切片不拥有它;只有切片被丢弃。
  4. 如果存储是动态分配的,它最终会被释放。

编辑

一般来说,在借用指针 ( &'a X ) 和包含借用指针 ( X<'a> ,其中 X 是一个 structenum 具有一个成员是借用的指针)和特征对象/约束( X+'a ,其中 Xtrait )当这些类型用作 struct 的成员时或 enum .

关于 let绑定(bind)和 as 的右侧运算符,您通常会编写没有生命周期注释的借用指针类型(即 &X ),因为编译器会在这种情况下推断生命周期。

您需要记住的是,在直接或间接处理借用指针时,生命周期注释是必要的。

如果你想了解更多关于所有权、借用和生命周期的信息,我建议你阅读the Rust Guide's section on pointers以及 Rust References and Lifetimes Guide

关于rust - 为什么结构中的切片需要生命周期,而不是向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26371255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com