gpt4 book ai didi

新类型 vec 的无 rust 解包

转载 作者:行者123 更新时间:2023-11-29 08:00:54 24 4
gpt4 key购买 nike

如果我有以下程序:

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 而无需添加任何额外的内存间接。

最佳答案

不,我怀疑你的函数会产生恒等函数(我查看了生成的程序集,肯定有一个分配)。这虽然会:

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

关于新类型 vec 的无 rust 解包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52238154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com