如果我有以下程序:
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
,而无需增加任何间接内存。
答案 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)
}
}