Rust中如何实现同数组内非重叠切片的拷贝操作
同数组内切片拷贝的最优实现
你遇到的双重借用问题是Rust借用规则的正常限制,不需要回退到低效循环,也不需要写unsafe代码,有两种标准库提供的安全方案可以选,性能和unsafe的指针拷贝完全一致。
方案1:使用内置的copy_within(最推荐,Rust 1.37+支持)
标准库的切片类型早就内置了专门用于内部范围拷贝的方法copy_within,就是为这种场景设计的,直接调用即可,不会触发借用冲突:
// 功能等价于你写的for循环:把索引20~29的元素拷贝到0~9的位置 self.ram.copy_within(20..30, 0);
这个方法会自动判断源范围和目标范围是否存在内存重叠,选择对应的拷贝逻辑,即使有重叠也能保证拷贝结果正确,编译后会优化为最优的内存批量拷贝指令,性能没有任何损耗。
方案2:使用split_at_mut拆分切片(兼容所有Rust版本)
如果需要兼容更老的Rust版本,可以用split_at_mut把原切片拆成两个互不相交的可变切片,从根源上规避双重借用问题,之后就可以正常调用copy_from_slice:
// 拷贝20~30位置到0~10位置 let (dst_slice, rest) = self.ram.split_at_mut(20); dst_slice[..10].copy_from_slice(&rest[..10]);
如果是拷贝低地址范围到高地址,只需要调整拆分的索引即可:
// 拷贝0~10位置到20~30位置 let (src_slice, dst_slice) = self.ram.split_at_mut(20); dst_slice[..10].copy_from_slice(&src_slice[..10]);
不推荐的写法说明
- 手写for循环:无法利用编译器和标准库的批量内存拷贝优化,大数组拷贝时性能差距明显
- 直接调用
arr[dst].copy_from_slice(&arr[src]):会同时持有数组的可变引用和不可变引用,违反Rust借用规则,无法编译通过 - 直接调用
std::ptr::copy_nonoverlapping:需要写unsafe块,虽然你已知内存不重叠,但完全没必要为这个场景引入unsafe代码,标准库的安全方法已经覆盖了这个需求,性能没有区别
内容的提问来源于stack exchange,提问作者Nikita Demodov
相关产品推荐
相关产品推荐

