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

Rust合并Vec<f64>:三种方法对比及性能与所有权疑问

合并多个小型Vec的方案对比与疑问解答

关于extend_from_slice的性能损耗

extend_from_slice确实会复制元素,但对于**小型Vec**来说,这种复制的性能差异几乎可以忽略不计。因为f64是Copy类型,复制操作就是底层内存块的直接拷贝,没有额外堆分配或复杂逻辑开销。

如果你之后还需要使用源Vec(比如示例里的h和i),这种方法是最优选择——它明确传达了“源数据不会被修改”的语义,代码可读性更强。

如何消费源Vec而无需声明可变

你可以使用Vec::extend配合into_iter(),直接消费源Vec的所有权,不需要将源Vec声明为可变:

let mut d: Vec<f64> = vec![];
let e = vec![0.0, 1.0];
let f = vec![2.0, 3.0];

// 消费e和f的所有权,将元素直接转移到d中
d.extend(e.into_iter());
d.extend(f.into_iter());

dbg!(d);

into_iter()会获取源Vec的所有权,把它的元素直接转移到目标Vec里,之后e和f就无法再被使用(所有权已被消耗)。这种方式和append性能一致——都是直接转移内存元素,没有复制开销,但不需要源Vec是可变的。

四种方案的适用场景总结

  • concat:适合已经持有Vec<Vec<f64>>集合的场景,代码最简洁,但本质是复制元素(依赖T: Clone约束),若子Vec数量多、元素量大,会产生额外复制成本。
  • append:需要源Vec可变,会清空源Vec并转移其内存元素,无复制开销,但可变声明容易让读者误解源数据会被修改,语义不够清晰。
  • extend_from_slice:无需源Vec可变,语义明确(源数据只读),小型Vec场景性能无压力,适合需要保留源Vec后续使用的情况。
  • extend + into_iter():无需源Vec可变,直接消费所有权,无复制开销,适合不需要再使用源Vec的场景,语义清晰且简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:35:51