新型vec的无锈包装

时间:2018-09-08 18:19:29

标签: rust newtype

如果我有以下程序:

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的集合?

我假设像Bar这样的新型包装器可以直接编译为Foo,而无需增加任何间接内存。

1 个答案:

答案 0 :(得分:1)

不,我怀疑您的函数会导致一个身份函数(我查看了生成的程序集,肯定有分配)。但是,这会:

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)
    }
}