如何在复制类型上获得内部可变性?

Mat*_* M. 5 unsafe rust

我有几种Copy类型,我真的很感激他们的轻松Copy.

我希望其中一种类型包含一个可变字段,使用内部可变性,如cell::Cell.对于我试图解决的问题,可能还有其他解决方案,但内部可变性很便宜.我喜欢便宜.

然而,事实证明事实cell::Cell并非如此Copy,并且从评论中不太可能成为Copy维护者担心这会容易出错.

OP的评论是我目前的希望灯塔:

如果它不适用于我自己的数据结构,那么这不是世界的绝对目的(因为我可以创建自己的版本Cell)

虽然我没有看到他们如何声称实现这一壮举.

我的核心问题是UnsafeCell:

  • 实施内部可变性是强制性的,
  • 不是Copy.

这似乎关起门来实现的希望CopyCell,除非我缺少一个窍门(办法unsafe implCopy特质?).


MCVE:

#[derive(Clone, Copy)]
struct HelloWorld(Cell<u32>);
Run Code Online (Sandbox Code Playgroud)
  |
3 | #[derive(Clone, Copy)]
  |                 ^^^^
4 | struct HelloWorld(Cell<u32>);
  |                   ---------- this field does not implement `Copy`
Run Code Online (Sandbox Code Playgroud)

我应该取代CellHelloWorldCopy


注意:目前,我能看到达到预期结果的唯一方法是使用&Cell<T>; 具有所有生命周期的含义.

Fra*_*gné 3

UnsafeCell我认为不实施有一个很好的理由Copy:在一般情况下它是不安全的。从 an读取UnsafeCell是一种不安全的操作,如该get方法的签名所示:它返回一个原始指针,并且取消引用原始指针是一种不安全的操作。副本将隐式读取该值,这可能会与另一个写入同一UnsafeCell. Cell没有这种竞争,因为它是!Sync(即两个线程不能访问相同的Cell)。

就我个人而言,我只会使用Clone::clone而不是弄乱引用。Cell是,clone因此#[inline]该调用很可能会在发布版本中被优化掉。