免费解开为新类型的vec

问题描述 投票:3回答:1

如果我有以下程序:

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以便我保留newtype抽象同时允许自由展开Bars集合?

我假设像Bar这样的newtype包装器直接编译到Foo而不添加任何额外的内存间接。

rust newtype
1个回答
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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.