代码之家  ›  专栏  ›  技术社区  ›  MaiaVictor

我可以将向量移动到结构内部而不完全复制它吗?

  •  2
  • MaiaVictor  · 技术社区  · 6 年前

    enum Store {
        Place { val: Vec<u8> },
    }
    
    fn subst(val: Vec<u8>, store: &mut Store) {
        *store = Store::Place { val }
    }
    

    subst 将移动 val 到里面去 store ,这会导致它被复制。有没有不复制整个向量的方法?我所说的“拷贝”是指内存拷贝。我的理解是,当一个值被移动时(例如 vec 打电话的时候 subst(vec, ...) ,它需要一个完整的副本来擦除父函数堆栈中的数据,并在被调用函数的堆栈上进行分配。

    1 回复  |  直到 6 年前
        1
  •  5
  •   ljedrz    6 年前

    此操作仅复制 Vec 对象,即指向其内容(而不是内容本身)的指针、容量和长度,因此您不必担心性能:

    fn move_vec(v: Vec<usize>) -> Vec<usize> {
        v
    }
    
    fn main() {
        let v1 = vec![1, 2, 3];
        println!("{:p}", &v1[1]);
    
        let v2 = move_vec(v1);
        println!("{:p}", &v2[1]); // the same location as above
    }
    
    推荐文章