< 返回版块

Bai-Jinlin 发表于 2023-03-21 17:10

Tags:dropck,PhantomData

https://doc.rust-lang.org/stable/src/alloc/collections/btree/map.rs.html#172-183 ,查看BtreeMap中看到了这个字段,我也学习过drop check相关的知识,但是我查看这个结构再https://doc.rust-lang.org/stable/src/alloc/collections/btree/node.rs.html#182-193 这里已经有了marker,并且这行代码的注释为the Box avoids making the Unpin impl more strict than before。翻译下就是这个代码避免了dropck的时候Unpin的实现比之前严格,请问有人知道这个是什么意思吗,为什么其他结构里比如Vec,HashMap都没加上这行代码。

评论区

写评论
作者 Bai-Jinlin 2023-03-22 09:28

感谢老哥!

--
👇
苦瓜小仔: 我发现第二个链接给错了,正确的在这 https://github.com/rust-lang/rust/pull/99413,也就是解决那个 issue 的链接。

我的理解是,使用 PhantomData<Box<(K, V)>> 是为了

  1. 考虑 drop K 和 V,这个方面看,写 PhantomData<(K, V)> 没问题

  2. 防止破坏当前的 Unpin impl:

impl<K, V, A> Unpin for BTreeMap<K, V, A>
where
A: Unpin,

如果你写 PhantomData<(K, V)>,会增加 K: UnpinV: Unpin 新的约束。例子

目前 K 和 V 的 Unpin 约束在 BTreeMap 的内部实现中

impl<K, V> Unpin for LeafNode<K, V>
where
K: Unpin,
V: Unpin,
苦瓜小仔 2023-03-21 23:16

我发现第二个链接给错了,正确的在这 https://github.com/rust-lang/rust/pull/99413,也就是解决那个 issue 的链接。

我的理解是,使用 PhantomData<Box<(K, V)>> 是为了

  1. 考虑 drop K 和 V,这个方面看,写 PhantomData<(K, V)> 没问题

  2. 防止破坏当前的 Unpin impl:

impl<K, V, A> Unpin for BTreeMap<K, V, A>
where
A: Unpin,

如果你写 PhantomData<(K, V)>,会增加 K: UnpinV: Unpin 新的约束。例子

目前 K 和 V 的 Unpin 约束在 BTreeMap 的内部实现中

impl<K, V> Unpin for LeafNode<K, V>
where
K: Unpin,
V: Unpin,
作者 Bai-Jinlin 2023-03-21 22:01
作者 Bai-Jinlin 2023-03-21 18:50

看了下,没帮助

--
👇
tch1121: https://youtu.be/_ccDqRTx-JU 可以看下这个不知道有没有帮助

tch1121 2023-03-21 17:30

https://youtu.be/_ccDqRTx-JU 可以看下这个不知道有没有帮助

1 共 6 条评论, 1 页