首页 > 解决方案 > 生锈不必要的内存副本?

问题描述

为了为具有生命周期切片的结构实现迭代器,我必须这样做


struct S<'a, T> {
    inner: &'a mut [T],
}

impl<'a, T> Iterator for S<'a, T> {
    type Item = &'a mut T;

    fn next(&mut self) -> Option<Self::Item> {
        let temp = std::mem::take(&mut self.inner);
        let (first, rest) = temp.split_first_mut()?;
        self.inner = rest;
        Some(first)
    }
}

在编写此代码时,我意识到生命周期会强制执行额外的内存复制(mem::take),这在 C 或 C++ 中是不必要的。我是否在这里遗漏了什么,或者这是生锈为终生付出的小代价?

标签: rust

解决方案


  1. LLVM 将优化不必要的副本。
  2. mem::take<T>要求T implsDefault所以不要将其视为通用解决方案。

推荐阅读