gpt4 book ai didi

memory - PhantomPinned 成员会使我的结构具有固定的内存地址吗?

转载 作者:行者123 更新时间:2023-12-03 08:07:44 25 4
gpt4 key购买 nike

我正在编写与 C API 通信的 Rust 代码,并且我需要某个结构来拥有固定的内存地址。到目前为止,我发现:

如果我理解正确,PhantomPinned 将是最容易使用的:只需将其作为成员即可使我的结构自动具有固定的内存地址。这是正确的吗?

最佳答案

您需要的是 Pin 。它是一个防止对象 move 的指针。

pin_mut!() 只是一个宏,可帮助您创建一个 Pin 实例,无需堆分配或 unsafe 代码。

PhantomPinned 还有另一个相关的目标。默认情况下,您的类型将实现 Unpin 特征(除非它包含不实现 Unpin 的类型,但大多数类型都会实现)。这是有问题的,因为对于实现 Unpin 的类型, Pin 没有效果:它不会阻止您 move 它们。这是因为大多数类型不需要固定的内存地址。例如,考虑 i32 :即使您创建 Pin<&mut i32> ,您也可以 move 它,因为 i32 实现 Unpin ,因为即使您 move 它也不会发生任何不好的事情,并且不会验证任何数据。

因此,为了使 Pin 有效,您需要取消实现 Unpin 。这是通过包含一个不将 Unpin 本身实现为字段的字段,或者具有负的 impl (参见 What is an auto trait in Rust? )来完成的:

impl !Unpin for MyType {}

不幸的是,负 impls 不稳定。相反,标准库提供了 PhantomPinned 类型,这是无成本的(ZST),但没有实现 Unpin (它有一个负 impl,因为标准库允许使用不稳定的功能,所以它可以做到这一点)。现在,当您的类型包含它时,它也会变成 !Unpin

总而言之,您需要在结构中包含 PhantomPinned ,这样它就不会是 Unpin ,并且您需要将它包装在 Pin 中,这样它就不可 move 。

关于memory - PhantomPinned 成员会使我的结构具有固定的内存地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71676444/

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