【问题标题】:Rust unnecessary memory copy?生锈不必要的内存副本?
【发布时间】:2021-04-14 03:50:56
【问题描述】:

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


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++ 中是不必要的。我是否在这里遗漏了什么,或者这是生锈付出一生的小代价?

【问题讨论】:

  • 你想像什么类似的 C++ 代码不会复制 inner? (记住inner 只是一个参考,而不是数据)
  • @trentcl: std::slice::IterMut 避免创建临时对象,但它使用原始指针和不安全的操作来代替...@pandawithcat,为什么不让inner 成为一个实例,然后委托给它?
  • 你为什么不使用某种...索引? play.rust-lang.org/…

标签: rust


【解决方案1】:
  1. LLVM 将优化不必要的副本。
  2. mem::take&lt;T&gt; 要求 T impls Default 所以不要将其视为通用解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多