存储Vec与Slice有什么区别?

时间:2015-09-14 18:22:41

标签: memory-management rust

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 }
    }
}

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

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

1 个答案:

答案 0 :(得分:10)

Vec由三部分组成:

  1. 指向一块内存的指针
  2. 分配内存的数量(容量
  3. 存储的项目数(尺寸
  4. 切片由两部分组成:

    1. 指向一块内存的指针
    2. 存储的项目数(尺寸
    3. 无论何时移动其中任何一个,这些字段都将被复制。正如你可能猜到的那样,它非常轻巧。堆上的实际内存块不会被复制或移动。

      Vec表示内存的所有权,而切片表示内存借用。当Vec本身被解除分配时,{{ line_item.price | times: 2 | money }} 需要释放所有项目和内存块(在Rust-speak中删除)。当它超出范围时会发生这种情况。切片掉落时切片什么都不做。

      使用切片没有危险,因为这是Rust 生命周期处理的内容。这些确保您从不使用引用后它将失效。