Ржавая ненужная копия памяти?

#rust

Вопрос:

Чтобы реализовать итератор для структуры, которая имеет срез со сроком службы, мне пришлось сделать

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

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

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

При написании этого кода я понял, что lifetime обеспечивает дополнительную копию памяти(mem::take), которая была бы ненужной в C или C . Я что-то здесь упускаю или это небольшая цена, которую ржавчина платит за всю жизнь?

Комментарии:

1. Какой аналогичный код C вы себе представляете, который не копируется inner ? (Имея в виду inner , что это просто ссылка , а не данные)

2. @trentcl: std::slice::IterMut избегает создания временного, но вместо этого использует необработанные указатели и небезопасные операции… @pandawithcat, почему бы не создать inner экземпляр этого и просто делегировать ему?

3. почему бы вам не использовать какой-нибудь… индекс ? play.rust-lang.org/…

Ответ №1:

  1. Ненужные копии должны быть оптимизированы LLVM.
  2. mem::take<T> требует, чтобы T impl s Default , поэтому не рассматривайте это как общее решение.