gpt4 book ai didi

compiler-errors - 包含具有特征参数的结构的框的大小

转载 作者:行者123 更新时间:2023-11-29 08:09:24 24 4
gpt4 key购买 nike

我需要一个包含特征对象和更多自身的结构。令人失望的是,以下代码无法编译:

trait Foo {}

struct Bar<T: Foo> {
bars: Vec<Box<Bar<dyn Foo>>>,
foo: T,
}

我设法通过添加绑定(bind)到 T?Sized 强制编译它,但我不明白为什么会这样。我假设这是因为所有特征对象都具有相同的大小,但是 Bar 的大小取决于具体类型 T 的大小。如果是这样,Bar 在内存中如何表示具有未调整大小的 T?具体是什么在堆上跟踪它的大小以及为什么这种机制不能用于大小的情况。

最佳答案

类型dyn Foo在编译时没有已知的大小。所以当你写 Bar<dyn Foo> ,编译器将不允许它,因为(默认情况下)必须调整类型参数的大小。编译器建议您通过允许 T 来解决此问题未调整大小,这是 T 所必需的成为dyn Foo .

how is Bar with an unsized T represented in memory?

一个结构最多允许有一个未调整大小的字段。然后将其数据布局在内存中,首先是大小字段,然后是未大小字段。此限制意味着可以在编译时知道所有字段的相对内存地址。带有 ?Sized 的结构类型参数本身可以是大小的或未大小的,具体取决于其参数的具体类型。当结构未调整大小时,它不能进入​​堆栈,因此您只能从指针后面使用它。

目前没有此类对象的文档。它不完全是一个特征对象,但它是一个指向可能未确定大小的对象的指针。正如您的示例所示,这有效。但我不能告诉你 vtable 在哪里指针被存储是因为我不知道,我也不确定如何找到。

Specifically what tracks its size on the heap and why can not this mechanism be used in the sized case.

每个对象的大小实际上并没有改变——它只是每个实例可能不同。该机制可以“在Sized 案例中”使用,但您没有合适的案例!即使是 T即尺寸,bars收藏品将包含 Bar<dyn Foo> 箱子这是未定尺寸的。这就是为什么你需要 T: ?Sized (与 T: !Sized 相对),表示此类型适用于 T尺寸或未尺寸。

关于compiler-errors - 包含具有特征参数的结构的框的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com