我需要一个包含特征对象及其自身的结构。令人失望的是,以下代码无法编译:
trait Foo {}
struct Bar<T: Foo> {
bars: Vec<Box<Bar<dyn Foo>>>,
foo: T,
}
我设法通过添加来强制编译?Sized
势必T
,但我不明白为什么会这样。我认为这是因为所有特征对象都具有相同的大小,但是Bar
取决于混凝土类型的尺寸T
。如果是这样,怎么样Bar
与一个未定尺寸的T
代表在内存中?具体来说,什么在堆上跟踪其大小以及为什么不能在大小确定的情况下使用此机制。
方式dyn Foo
在编译时没有已知的大小。所以当你写的时候Bar<dyn Foo>
,编译器将不允许这样做,因为(默认情况下)必须调整类型参数的大小。编译器建议您通过允许来修复此问题T
无法调整大小,这是必要的T
to be dyn Foo
.
how is Bar
与一个未定尺寸的T
代表在内存中?
一个结构最多允许有一个未调整大小的字段。然后将其数据布置在内存中,首先确定大小的字段,最后是未确定大小的字段。这个限制意味着所有字段的相对内存地址可以在编译时知道。一个结构体带有?Sized
类型参数本身可以是已调整大小的,也可以是未调整大小的,具体取决于其参数的具体类型。当结构未调整大小时,它不能进入堆栈,因此只能从指针后面使用它。
目前没有关于此类对象的文档。它不完全是一个特征对象,但它是一个指向可能无法确定大小的对象的指针。正如您的示例所示,这是有效的。但我不能告诉你在哪里vtable
指针被存储是因为我不知道,而且我不知道如何找到。
具体来说,什么在堆上跟踪其大小以及为什么不能在大小确定的情况下使用此机制。
每个对象的大小实际上并没有改变——只是每个实例可能不同。机制can被用于“在Sized
案例”,但您没有尺寸合适的案例!即使是T
即尺寸为bars
集合将包含盒子Bar<dyn Foo>
没有尺寸的。这就是为什么你需要T: ?Sized
(相对于T: !Sized
),说这种类型适用于T
要么已调整大小,要么未调整大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)