存储Vec与Slice有什么区别?

KCh*_*oux 6 memory-management rust

Rust提供了一些在用户定义的结构中存储元素集合的方法.可以为结构提供自定义生存期说明符和对切片的引用:

struct Foo<'a> {
    elements: &'a [i32]
}

impl<'a> Foo<'a> { 
    fn new(elements: &'a [i32]) -> Foo<'a> { 
        Foo { elements: elements }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者可以给它一个Vec对象:

struct Bar {
    elements: Vec<i32>
}

impl Bar {
    fn new(elements: Vec<i32>) -> Bar {
        Bar { elements: elements }
    }
}
Run Code Online (Sandbox Code Playgroud)

这两种方法有哪些主要区别?

  • Vec每当我打电话时,会使用强制语言来复制内存Bar::new(vec![1, 2, 3, 4, 5])吗?
  • Vec当所有者Bar超出范围时,是否会隐含销毁内容?
  • 如果在传递给它的结构之外使用切片,是否存在与通过引用传递切片相关的危险?

She*_*ter 11

A Vec由三部分组成:

  1. 指向一大块内存的指针
  2. 分配了多少内存(容量)
  3. 存储的项目数(大小)

切片由两部分组成:

  1. 指向一大块内存的指针
  2. 存储的项目数(大小)

无论何时移动其中任何一个,这些字段都将被复制.正如你可能猜到的那样,它非常轻巧.堆上的实际内存块不会被复制或移动.

A Vec表示内存的所有权,而切片表示内存借用.一个Vec需要释放了所有的项目和内存块时,它本身就是重新分配的(下降的防锈说吧).当它超出范围时会发生这种情况.切片掉落时切片不做任何操作.

使用切片没有危险,因为这是Rust 生命周期所处理的.这些确保您在引用无效后永远不会使用引用.

  • 每种类型的组成部分的详细说明非常清楚。 (3认同)

xin*_*AOr 6

Vec 是一个可以增大或缩小大小的集合。它存储在堆上,并在运行时动态分配和释放。Vec 可用于存储任意数量的元素,通常在编译时未知元素数量或在程序执行期间元素数量可能发生变化时使用。

切片是对 Vec 或其他集合中连续元素序列的引用。它使用 [T] 语法表示,其中 T 是切片中元素的类型。切片本身不存储任何元素,它仅引用存储在另一个集合中的元素。当需要引用集合中的元素子集时,通常使用切片。

Vec 和切片之间的主要区别之一是 Vec 可用于添加和删除元素,而切片仅提供对集合中元素子集的只读访问。另一个区别是 Vec 是在堆上分配的,而切片是引用,因此具有固定大小。这意味着切片不能用于存储新元素,但可以用于引用 Vec 或其他集合中元素的子集。