如果我有以下程序:
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抽象同时允许自由展开Bar
s集合?
我假设像Bar
这样的newtype包装器直接编译到Foo
而不添加任何额外的内存间接。
不,我怀疑你的函数会导致身份函数(我查看生成的程序集,肯定有一个分配)。这会是:
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)
}
}