< 返回版块

zjhken 发表于 2023-10-19 22:04

Tags:async,trait,unsafe,pointer

下面这个例子的原意图是将这个异步方法存起来放进Vec中, 再在别的地方用unsafe恢复方法并运行. 因为方法都是编译期就知道大小的, 所以它的指针的地指应该是不变的, 内容也不变, 所以应该是安全的? 但是下面这个例子是编译不过的, 因为AsyncFn是Trait Object, 无法直接cast 成 *const ().

请问要怎么编写这段代码? (使用unsafe是故意的)


Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=e825dc6483bcf5097389e4a33221d13f

评论区

写评论
TinusgragLin 2023-12-17 00:07

to_raw_parts好像可以用,但感觉不需要,可以直接存 &dyn Trait*const dyn Trait

#![feature(ptr_metadata)]
use std::ptr::DynMetadata;

trait JustGetIt {
    fn just_get_it(&self) -> usize;
}
impl JustGetIt for usize {
    fn just_get_it(&self) -> usize { *self }
}
impl JustGetIt for std::num::NonZeroUsize {
    fn just_get_it(&self) -> usize { self.get() }
}

let n = 3usize;
let m = std::num::NonZeroUsize::new(42).unwrap();

let mut v1: Vec<&dyn JustGetIt> = Vec::new();
v1.push(&n as &dyn JustGetIt);
v1.push(&m as &dyn JustGetIt);

let mut v2: Vec<*const dyn JustGetIt> = Vec::new();
v2.push(&n as *const dyn JustGetIt);
v2.push(&m as *const dyn JustGetIt);

let mut v2: Vec<(*const (), DynMetadata<dyn JustGetIt>)> = Vec::new();
v2.push((&n as *const dyn JustGetIt).to_raw_parts());
v2.push((&m as *const dyn JustGetIt).to_raw_parts());
TinusgragLin 2023-12-16 01:55

lz可以看看这个讲dispatch和fat pointer的视频b站搬运),这个up主的rust内容都挺不错的,lz可以关注关注!

TinusgragLin 2023-12-16 01:47

lz给出的看起来是 static dispatch,dyn Trait才是 trait object 吧!用的话都用 &dyn Trait或者Box<dyn Trait>,这个我记得是由数据地址+vtable地址组成的 fat pointer,stdlib有一个unstable的to_raw_parts可以拿到数据地址和vtable地址(metadata),(&dyn Trait as *const _).to_raw_parts(),lz可以试试!

asuper 2023-10-30 11:28

这玩法好复杂,核心问题是Out的类型可能要支持多个,导致必须使用Trait对象吧,遇到过类似的问题,后面解决的也不漂亮。

提一点浅见,Trait Object应该本来就不是指针,是栈上的对象吧,我觉得你可以用Box::Leak()试试

作者 zjhken 2023-10-20 22:30

搞不定, 他的case和我的case不一样, 他的生命周期是在外面用+号串起来, 我这个是在泛型的<>里面的, 搞不懂

--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

作者 zjhken 2023-10-20 15:28

感谢!我晚上研究一下, 它的目标与我的似乎是一致的

--
👇
Bai-Jinlin: 你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

Bai-Jinlin 2023-10-20 09:22

你参考这个吧 https://docs.rs/futures-task/0.3.28/src/futures_task/future_obj.rs.html

1 共 7 条评论, 1 页