我有几种Copy
类型,我真的很感激他们的轻松Copy
.
我希望其中一种类型包含一个可变字段,使用内部可变性,如cell::Cell
.对于我试图解决的问题,可能还有其他解决方案,但内部可变性很便宜.我喜欢便宜.
然而,事实证明事实cell::Cell
并非如此Copy
,并且从评论中不太可能成为Copy
维护者担心这会容易出错.
OP的评论是我目前的希望灯塔:
如果它不适用于我自己的数据结构,那么这不是世界的绝对目的(因为我可以创建自己的版本
Cell
)
虽然我没有看到他们如何声称实现这一壮举.
我的核心问题是UnsafeCell
:
Copy
.这似乎关起门来实现的希望CopyCell
,除非我缺少一个窍门(办法unsafe impl
的Copy
特质?).
MCVE:
#[derive(Clone, Copy)]
struct HelloWorld(Cell<u32>);
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)| 3 | #[derive(Clone, Copy)] | ^^^^ 4 | struct HelloWorld(Cell<u32>); | ---------- this field does not implement `Copy`
我应该取代Cell
与HelloWorld
被Copy
?
注意:目前,我能看到达到预期结果的唯一方法是使用&Cell<T>
; 具有所有生命周期的含义.
UnsafeCell
我认为不实施有一个很好的理由Copy
:在一般情况下它是不安全的。从 an读取UnsafeCell
是一种不安全的操作,如该get
方法的签名所示:它返回一个原始指针,并且取消引用原始指针是一种不安全的操作。副本将隐式读取该值,这可能会与另一个写入同一UnsafeCell
. Cell
没有这种竞争,因为它是!Sync
(即两个线程不能访问相同的Cell
)。
就我个人而言,我只会使用Clone::clone
而不是弄乱引用。Cell
是,clone
因此#[inline]
该调用很可能会在发布版本中被优化掉。