Почему AtomicPtr запрещает динамически изменяемые типы? - PullRequest
4 голосов
/ 20 февраля 2020

Я хотел создать AtomicPtr для среза, но с удивлением обнаружил, что не могу.

struct MyObject {
    ptr: AtomicPtr<[u32]>
}

выдает ошибку:

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`

См. это на Rust Playground

Я лично не понимаю, почему это так, но я мог что-то упустить. Есть ли причина для такого ограничения? И есть ли обходной путь для достижения той же функциональности?

1 Ответ

7 голосов
/ 20 февраля 2020

Намеренно, что AtomicPtr<T> работает только с T: Sized, потому что в кусочках ржавчины и объектах черты - жирные указатели (размер двойной относительно нормального указателя).

На самом деле невозможно T: ?Sized, поскольку это предотвращает гарантию работы atomi c для некоторых платформ, например ARM.

См. здесь для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...