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
相关产品推荐
相关产品推荐

