You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中转移所有权时如何避免底层数据拷贝?

在Rust中无底层数据拷贝转移所有权

首先纠正你的误解:直接传递Vec的所有权(比如take_ownership_but_memcopies的调用方式)并不会触发底层数组的memcopy。

Rust里的Vec本质是一个"胖指针",它包含三个部分:

  • 指向堆上底层数据的指针
  • 数组的当前长度
  • 数组的容量

当你把Vec作为参数传递给函数(值传递)时,只会拷贝这三个字段(总共几十字节,完全可以忽略),堆上的实际数据根本不会被复制。函数拿到的是Vec的所有权,但底层数据还是在原来的堆地址上,没有任何memcopy操作。

所以你的代码可以直接修改成这样:

fn main() {
    let v1 = Vec::from([1; 1024]);
    take_ownership_but_memcopies(v1);

    let v2 = Vec::from([2; 1024]);
    dont_memecopy_but_dont_take_ownership(&v2);

    let v3 = Vec::from([3; 1024]);
    take_ownership_dont_memcopy(v3); // 直接传v3即可
}

// 这里其实没有memcopy底层数据,只是转移Vec的所有权
fn take_ownership_but_memcopies(my_vec1: Vec<i32>) {
    println!("{:?}", my_vec1);
}

// 传递引用,不获取所有权,无拷贝
fn dont_memecopy_but_dont_take_ownership(my_vec2: &Vec<i32>) {
    println!("{:?}", my_vec2);
}

// 参数类型就是Vec<i32>,转移所有权且无底层数据拷贝
fn take_ownership_dont_memcopy(my_vec3: Vec<i32>) {
    println!("{:?}", my_vec3);
}

总结一下:

  • 如果你想获取所有权且无底层数据拷贝,直接传递Vec的值即可,Rust的所有权转移机制保证了不会复制底层数据。
  • 只有当你主动调用clone()方法时,才会真正复制底层的数组数据,产生memcopy开销。

内容的提问来源于stack exchange,提问作者oneneozero oneneozero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:36:29