首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Box<trait>的大小与Box<struct>不同?

为什么Box<trait>的大小与Box<struct>不同?
EN

Stack Overflow用户
提问于 2016-10-23 12:47:58
回答 2查看 126关注 0票数 7

考虑一下守则:

代码语言:javascript
复制
use std::boxed::Box;
use std::mem::transmute;

trait Total {
    fn total(&self) -> i32;
}

#[derive(Debug)]
struct S {
    a: i32,
    b: i32,
    c: i32,
}

impl S {
    fn new() -> S {
        S { a: 2, b: 3, c: 4 }
    }
}

impl Total for S {
    fn total(&self) -> i32 {
        self.a + self.b + self.c
    }
}

fn main() {
    let b: Box<Total> = Box::new(S::new());
    unsafe {
        let s: Box<S> = std::mem::transmute(b);
        println!("S = {:?}", s);
    }
}

这就产生了错误:

代码语言:javascript
复制
error[E0512]: transmute called with differently sized types: Box<Total> (128 bits) to Box<S> (64 bits)
  --> src/main.rs:30:29
   |
30 |             let s: Box<S> = std::mem::transmute(b);
   |                             ^^^^^^^^^^^^^^^^^^^

既然Box<Total>实际上是一个Box<S>,那么为什么我们会得到这个错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-23 13:07:01

不同于大多数在class中嵌入虚拟指针的面向对象概念的语言,Rust使用胖指针方法,在这种方法中,它同时携带虚拟指针和struct指针。

因此,Box<Trait>S布局如下:

代码语言:javascript
复制
+-------+-------+
| v-ptr | S-ptr |
+-------+-------+

它是64位平台上的128位。

至于下播,目前您可以使用Any类型及其downcast_refdowncast_mut

对于更详细的用例,您也可能对接口机箱感兴趣。

票数 10
EN

Stack Overflow用户

发布于 2016-10-23 13:06:25

https://doc.rust-lang.org/stable/book/trait-objects.html,如Box<Trait>&Trait包含两个指针

  • 指向数据的指针
  • 指向vtable的指针

两个指针(在64位机器上)加起来为128位.

Box<Struct>只包含一个直接指向数据的指针。不需要vtable,因为特定的方法能够在编译时被静态解析。此单个指针仅为64位。

考虑到Box<Total>实际上是一个Box<S>

他们不是。如果他们是一样的,为什么他们会有不同的名字?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40203073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档