Memory management 存储Vec与存储切片之间的区别是什么?

Memory management 存储Vec与存储切片之间的区别是什么?,memory-management,rust,Memory Management,Rust,Rust提供了几种在用户定义的结构中存储元素集合的方法。可以为该结构提供自定义生存期说明符和对切片的引用: struct Foo<'a> { elements: &'a [i32] } impl<'a> Foo<'a> { fn new(elements: &'a [i32]) -> Foo<'a> { Foo { elements: elements } } } 这两种方法之间

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

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

impl<'a> Foo<'a> { 
    fn new(elements: &'a [i32]) -> Foo<'a> { 
        Foo { elements: elements }
    }
}
这两种方法之间的主要区别是什么

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

  • A
    Vec
    由三部分组成:

  • 指向内存块的指针
  • 分配了多少内存(容量)的计数
  • 存储的项目数(大小)
  • 切片由两部分组成:

  • 指向内存块的指针
  • 存储的项目数(大小)
  • 无论何时移动其中一个字段,都将复制这些字段。正如你可能猜到的,这相当轻。堆上的实际内存块不会被复制或移动

    Vec
    表示内存的所有权,切片表示内存借用。
    Vec
    需要在其自身解除分配时解除分配所有项和内存块(在Rust speak中删除)。当它超出范围时就会发生这种情况。切片掉落时不起任何作用


    使用切片是没有危险的,因为生锈寿命就是这样处理的。这些确保了在引用失效后,您永远不会使用引用。

    每种类型的引用所包含的内容的分类非常清楚。
    struct Bar {
        elements: Vec<i32>
    }
    
    impl Bar {
        fn new(elements: Vec<i32>) -> Bar {
            Bar { elements: elements }
        }
    }