gpt4 book ai didi

memory-management - 存储 Vec 和 Slice 有什么区别?

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

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

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

impl<'a> Foo<'a> {
fn new(elements: &'a [i32]) -> Foo<'a> {
Foo { elements: elements }
}
}

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

struct Bar {
elements: Vec<i32>
}

impl Bar {
fn new(elements: Vec<i32>) -> Bar {
Bar { elements: elements }
}
}

这两种方法之间的主要区别是什么?

  • 是否会在我调用 Bar::new(vec![1, 2, 3, 4, 5]) 时使用 Vec 强制语言复制内存?
  • 当所有者 Bar 超出范围时,Vec 的内容是否会被隐式销毁?
  • 如果在要传递给它的结构之外使用它,通过引用传递切片是否有任何危险?

最佳答案

一个Vec由三部分组成:

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

切片由两部分组成:

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

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

Vec 表示内存的所有权,切片表示内存的借用。 Vec 需要在它自己被释放时释放所有项目和内存块(用 Rust 语言来说是 dropped)。当它超出范围时会发生这种情况。切片在放下时不执行任何操作。

使用切片没有危险,因为这是 Rust lifetimes 处理的。这些可确保您永远不会在引用失效后使用它。

关于memory-management - 存储 Vec 和 Slice 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32571441/

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