为什么 AtomicPtr 不允许动态大小的类型?

kmd*_*eko 4 rust

我想创建AtomicPtr一个切片,但我惊讶地发现我不能。

struct MyObject {
    ptr: AtomicPtr<[u32]>
}
Run Code Online (Sandbox Code Playgroud)

产生错误:

error[E0277]: the size for values of type `[u32]` cannot be known at compilation time
 --> src/lib.rs:4:5
  |
4 |     ptr: AtomicPtr<[u32]>
  |     ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `[u32]`
  = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
  = note: required by `std::sync::atomic::AtomicPtr`
Run Code Online (Sandbox Code Playgroud)

Rust Playground上看到它

我个人不明白为什么会这样,但我可能会遗漏一些东西。这个限制有什么原因吗?是否有实现相同功能的解决方法?

att*_*ona 7

这是故意的是AtomicPtr<T>只适用T: Sized,因为铁锈片和特质对象是脂肪指针(大小双对于正常的指针)。

实际上这是不可能的,T: ?Sized因为这会妨碍某些平台(例如 ARM)的原子操作保证。

请参阅此处了解更多详情。