【发布时间】:2021-10-14 15:15:51
【问题描述】:
在关于不同类型内存布局的 Rust tutorial 中,它谈到了 trait 对象。然而,如图所示,存在于堆栈中的特征对象部分具有恒定大小:一个 word 用于指向值的指针,另一个 word 用于指向其 vtable 的指针 = 64 位机器上的 16 字节.
我的问题是,如果特征对象具有固定大小,为什么我们需要对它的引用?这个由两个词组成的“胖指针”实际上是引用吗,因为这与引用在所有其他 Rust 中的工作方式不一致,它只是指向某些数据的瘦指针。而且我不相信 Rust 会不必要地隐藏这些细节并且前后不一致。
【问题讨论】:
-
&dyn Trait是胖指针(2 个字)。dyn Trait(没有参考)没有大小。是的,Rust 是“不一致的”,因为普通指针和胖指针都使用&。另请参阅&[u8]的大小与&[u8; N]的大小。 -
该图像不构成完整示例。
w是一个可变引用,类型为&mut dyn Write,实际上是Sized。不是Sized的是底层值,它的类型在被制成特征对象时被擦除。 -
dyn Trait指的是数据指针后面的实际对象,可以是任意大小。 (在这种情况下,它是 3 个机器字,因为实现者是Vec。)当你把它放在一个引用后面时,你会得到一个熟悉的具有常量大小的对象,一个指针-指针对(如果是 trait 对象)或一个指针切片情况下的 -length 对。
标签: rust reference trait-objects