考虑一下守则:
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);
}
}这就产生了错误:
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>,那么为什么我们会得到这个错误呢?
发布于 2016-10-23 13:07:01
发布于 2016-10-23 13:06:25
https://doc.rust-lang.org/stable/book/trait-objects.html,如Box<Trait>或&Trait,包含两个指针
两个指针(在64位机器上)加起来为128位.
Box<Struct>只包含一个直接指向数据的指针。不需要vtable,因为特定的方法能够在编译时被静态解析。此单个指针仅为64位。
考虑到
Box<Total>实际上是一个Box<S>
他们不是。如果他们是一样的,为什么他们会有不同的名字?
https://stackoverflow.com/questions/40203073
复制相似问题