Rust free unwrap для vec новинок - PullRequest
       31

Rust free unwrap для vec новинок

0 голосов
/ 08 сентября 2018

Если у меня есть следующая программа:

struct Foo {
    a: usize,
    b: usize,
}

struct Bar(Foo);

fn unwrap_bars(bars: Vec<Bar>) -> Vec<Foo> {
  bars.into_iter().map(|b| b.0).collect()
}

Будет ли unwrap_bars скомпилирована в функцию идентификации?Если он не скомпилирован в функцию идентификации, то как я могу написать unwrap_bars, чтобы я сохранил абстракцию нового типа и разрешил бесплатное развертывание коллекции Bar s?

Я предполагаю, что оболочка нового типа похожаBar компилируется непосредственно в Foo без добавления дополнительной памяти.

1 Ответ

0 голосов
/ 08 сентября 2018

Нет, я сомневаюсь, что ваша функция приведет к функции идентичности (я посмотрел на сгенерированную сборку и определенно было выделение). Это будет, хотя:

fn unwrap_bars(mut bars : Vec<Bar>) -> Vec<Foo> {
    unsafe {
        let ptr = bars.as_mut_ptr() as *mut Foo;
        let len = bars.len();
        let cap = bars.capacity();
        std::mem::forget(bars);     // to prevent destructor being called
        Vec::from_raw_parts(ptr, len, cap)
    }
}
...