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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:06:20