微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改动态调度/特征对象的数据指针?

如何解决如何更改动态调度/特征对象的数据指针?

我有一个名为Vec<u8>的{​​{1}}和一个类型为vec的名为x的变量。我希望&dyn Trait的数据指针指向x中的位置。

vec

我正在尝试开发类似JVM的虚拟机。每个实现所需特征(#[derive(Debug)] struct Point { x: u8,y: u8,} fn main() { let vec: Vec<u8> = vec![35,1,51,10]; let x: &dyn Debug; // create a &dyn Debug with its data pointer // pointing to vec[2] while the vtable points // to Point's implementation of Debug println!("{:?}",x); // expected output: "Point { x: 51,y: 10 }" } Point)的结构(Linedisplay)实际上都是指令(DebugAdd ,...)将实现特征Mov,该特征包含指令本身的代码

这是另一个更接近我想做的例子:

Instruction

多个不同长度的use std::fmt::{self,display}; struct Point { pub x: u8,pub y: u8,} impl display for Point { fn fmt(&self,f: &mut fmt::Formatter) -> fmt::Result { write!(f,"({},{})",self.x,self.y) } } struct Line { pub start: Point,pub end: Point,} impl display for Line { fn fmt(&self,self.start,self.end) } } struct Data { vec: Vec<u8>,index: usize,} impl Data { fn new(vec: Vec<u8>) -> Self { Self { vec,index: 0 } } fn next(&mut self) -> Option<&dyn display> { let obj; self.index += 1; match self.vec[self.index] { 0 => { obj = Some(/* &Point { ... } with address equal to &(self.vec[self.index])*/); self.index += std::mem::size_of::<Point>(); } 1 => { obj = Some(/* &Line { ... } with address equal to &(self.vec[self.index])*/); self.index += std::mem::size_of::<Line>(); } _ => { obj = None; } } obj } } fn main() { let raw_vec: Vec<u8> = vec![0,24,53,65,103,68,10,2]; let data = Data::new(raw_vec); assert!(format!("{}",data.next().unwrap()) == "(24,53)".to_string()); assert!(format!("{}",data.next().unwrap()) == "((65,103),(68,10))".to_string()); } 将与struct共享它们的数据。在此示例中,我的Vec<u8>的内存布局可能与我想像的不匹配,但这无关紧要,因为不需要在编译时知道它们的布局,而仅在运行时才知道。将struct视为该程序从文件读取的字节,而文件本身是由同一程序创建的。

即使这是不安全或不确定的行为,并且不使用智能指针/堆分配,我该怎么办?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。