Blog
网站首页
Trait Object的虚表探索
Trait Object的虚表探索
2022-11-15 15:59
2023-02-23 10:38
作者:
xmh0511
提交
````rust use std::any::Any; struct TestA{ c:f64, c2:f64, c3:f64 } impl TestA{ fn memeber(&self){} } trait MyTrait{ fn show(&self)->i32; } impl MyTrait for TestA{ fn show(&self)->i32 { //self.v println!("invoke"); 0 } } impl Drop for TestA{ fn drop(&mut self) { println!("drop"); } } #[repr(C)] // 保证数据和field一一对应 struct Vtable{ drop:fn(* const ()), size:usize, alignment:usize, f:fn(* const())->i32 } trait TraitForDyn{ } impl
TraitForDyn for &T{ } fn test_trait
(v:T){} fn main() { println!("{x}",x = std::mem::size_of::
()); let i = TestA{c:0.0,c2:0.0,c3:0.0}; unsafe { let pp = &i as * const TestA; println!("obj addresss: {:p}",pp); }; let rf:& dyn MyTrait = &i; // let d = rf.show(); unsafe { let ptr = &rf as * const &dyn MyTrait as *const * const(); let data = *ptr; let vtable = *ptr.add(1); let vt = vtable as * const Vtable; let vt = &*vt; let r = vt.size; let f2 = vt.f; let drp = vt.drop; let alignment = vt.alignment; f2(data); //drp(data); println!("obj size: {r}"); println!("obj alignment {alignment}"); println!("{vtable:?}"); }; use std::fmt::Pointer; unsafe { let ptr = rf as * const dyn MyTrait; let c = (ptr as * const ()); println!("c addr: {c:p}"); let size = std::mem::size_of::<* const dyn MyTrait>(); println!("size: = {size}"); }; } ```` https://alschwalm.com/blog/static/2017/03/07/exploring-dynamic-dispatch-in-rust/