【问题标题】:What is the difference between storing a Vec vs a Slice?存储 Vec 和 Slice 有什么区别?
【发布时间】:2015-12-10 20:19:17
【问题描述】:

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 的内容是否会被隐式销毁?
  • 如果在要传递到的结构之外使用通过引用传入切片,是否存在任何危险?

【问题讨论】:

    标签: memory-management rust


    【解决方案1】:

    一个Vec由三部分组成:

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

    切片由两部分组成:

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

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

    Vec 表示内存的所有权,切片表示内存借用。 Vec 在自身被释放时需要释放所有项目和内存块(dropped 在 Rust 语言中)。当它超出范围时会发生这种情况。切片被丢弃时什么都不做。

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

    【讨论】:

    • 对每种类型的构成非常清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 2014-09-18
    • 2021-11-07
    • 2022-08-07
    • 2018-04-20
    • 2020-12-21
    相关资源
    最近更新 更多