特征对象
特征(Trait)对象可接受不同类型的值,举例来说,在集合中会是这样:
以下是分配 pets
后的内存布局:
Speaker Notes
This slide should take about 10 minutes.
- 实现给定 trait 的类型可能大小不同。因此,上例中不可能具有像
Vec<dyn Pet>
这样的项。 - 可通过“dyn Pet”这个方法向编译器告知实现“Pet”的动态大小类型。
- 在本例中,
pets
在栈上分配内存,矢量数据存储在堆上。这两个矢量元素是 胖指针:- 胖指针属于全角指针。它包含两个部分:指向实际对象的指针,以及指向该特定对象的
Pet
实现的 虚拟方法表 (vtable) 的指针。 Dog
(名为 Fido)类型的数据是name
和age
字段。Cat
类型包含一个lives
字段。
- 胖指针属于全角指针。它包含两个部分:指向实际对象的指针,以及指向该特定对象的
- 比较上述示例中的这些输出:
println!("{} {}", std::mem::size_of::<Dog>(), std::mem::size_of::<Cat>()); println!("{} {}", std::mem::size_of::<&Dog>(), std::mem::size_of::<&Cat>()); println!("{}", std::mem::size_of::<&dyn Pet>()); println!("{}", std::mem::size_of::<Box<dyn Pet>>());