Rust中的胖指针怎么使用
这篇文章主要讲解了“Rust中的胖指针怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Rust中的胖指针怎么使用”吧!

10年积累的成都网站设计、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有于都免费网站建设让你可以放心的选择与我们合作。
唤醒器
Waker
类型允许在运行时的reactor 部分和执行器部分之间进行松散耦合。Future
执行绑定的唤醒机制,运行时实现者可以提出有趣的新唤醒机制。例如,可以生成一个线程来执行一些工作,这些工作结束时通知
Future
,这完全独立于当前的运行时。leaf-future
来扩展生态系统。如果你想了解更多关于 Waker 类型背后的原因,我可以推荐 Withoutboats articles series about them 。
理解唤醒器
Future
时,我们遇到的最令人困惑的事情之一就是我们如何实现一个唤醒器。创建一个 Waker 需要创建一个 vtable,这个vtable允许我们使用动态方式调用我们真实的Waker实现.如果你想知道更多关于Rust中的动态分发,我可以推荐 Adam Schwalm 写的一篇文章 Exploring Dynamic Dispatch in Rust .
Rust中的胖指针
trait SomeTrait { }fn main() {println!("======== The size of different pointers in Rust: ========");println!("&dyn Trait:-----{}", size_of::<&dyn SomeTrait>());println!("&[&dyn Trait]:--{}", size_of::<&[&dyn SomeTrait]>());println!("Box:-----{}", size_of:: >()); println!("&i32:-----------{}", size_of::<&i32>());println!("&[i32]:---------{}", size_of::<&[i32]>());println!("Box:-------{}", size_of:: >()); println!("&Box:------{}", size_of::<&Box >()); println!("[&dyn Trait;4]:-{}", size_of::<[&dyn SomeTrait; 4]>());println!("[i32;4]:--------{}", size_of::<[i32; 4]>());}
&[i32]
:前8个字节是指向数组中第一个元素的实际指针(或 slice 引用的数组的一部分) 第二个8字节是切片的长度
&dyn SomeTrait
:&dyn SomeTrait
是一个trait的引用,或者 Rust称之为一个trait对象。前8个字节指向trait 对象的data 后八个字节指向trait对象的 vtable
// A reference to a trait object is a fat pointer: (data_ptr, vtable_ptr)trait Test {fn add(&self) -> i32;fn sub(&self) -> i32;fn mul(&self) -> i32;}// This will represent our home brewn fat pointer to a trait object#[repr(C)]struct FatPointer<'a> {/// A reference is a pointer to an instantiated `Data` instancedata: &'a mut Data,/// Since we need to pass in literal values like length and alignment it's/// easiest for us to convert pointers to usize-integers instead of the other way around.vtable: *const usize,}// This is the data in our trait object. It's just two numbers we want to operate on.struct Data {a: i32,b: i32,}// ====== function definitions ======fn add(s: &Data) -> i32 {s.a + s.b}fn sub(s: &Data) -> i32 {s.a - s.b}fn mul(s: &Data) -> i32 {s.a * s.b}fn main() {let mut data = Data {a: 3, b: 2};// vtable is like special purpose array of pointer-length types with a fixed// format where the three first values has a special meaning like the// length of the array is encoded in the array itself as the second value.let vtable = vec![0, // pointer to `Drop` (which we're not implementing here)6, // lenght of vtable8, // alignment// we need to make sure we add these in the same order as defined in the Trait.add as usize, // function pointer - try changing the order of `add`sub as usize, // function pointer - and `sub` to see what happensmul as usize, // function pointer];let fat_pointer = FatPointer { data: &mut data, vtable: vtable.as_ptr()};let test = unsafe { std::mem::transmute::(fat_pointer) }; // And voalá, it's now a trait object we can call methods onprintln!("Add: 3 + 2 = {}", test.add());println!("Sub: 3 - 2 = {}", test.sub());println!("Mul: 3 * 2 = {}", test.mul());}
感谢各位的阅读,以上就是“Rust中的胖指针怎么使用”的内容了,经过本文的学习后,相信大家对Rust中的胖指针怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
分享题目:Rust中的胖指针怎么使用
标题链接:http://www.jxjierui.cn/article/jsgdpg.html


咨询
建站咨询
