小编Dan*_*ila的帖子

如何从 Box<Trait> 获取指向虚拟表的指针?

我想了解虚拟表的工作原理并可能在将来使用它。我知道DST指针是胖指针(usize,usize),其中第一个指针是数据,第二个指针是虚拟表。我能够通过指针获取数据,但显然它没有\xe2\x80\x99无法获取指向虚拟表的指针,因为来自https://docs.google.com/presentation/d/1q- c7UAyrUlM-eZyTo1pd8SZ0qwA_wYxmPZVOQkoDmH4/edit#slide=id.p结构体的大小应该由下面代码中的size变量中的指针存储,但事实并非如此。也许我没有正确理解虚拟表是如何存储的?

\n

我的代码:

\n
#![feature(pointer_byte_offsets)]\n\ntrait MyRule {\n    fn some_method1(&self) {}\n    fn some_method2(&self) {}\n}\nstruct MyData {\n    data: u32,\n}\n\nimpl MyRule for MyData {}\n\nfn main() {\n    unsafe {\n        let b: Box<dyn MyRule> = Box::new(MyData { data: 5 });\n        let fat_ptr = Box::into_raw(b);\n        dbg!(*(fat_ptr.cast::<u32>())); // data = 5\n        let vtbl_ptr = fat_ptr.byte_add(8).cast::<*mut usize>();\n        let destructor_ptr = (*vtbl_ptr).cast::<usize>();\n        let size = destructor_ptr.byte_add(8);\n        dbg!(size);\n        dbg!(*size); // Not size!!!\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我认为问题在于我没有正确获取指向表本身的指针。那么正确的方法是什么?如何访问表元素?

\n

pointers vtable rust

2
推荐指数
1
解决办法
792
查看次数

标签 统计

pointers ×1

rust ×1

vtable ×1