Закрепление (pinning)
В этом разделе курса рассматривается:
- Что такое «pinning»
- Зачем он нужен
- Как Rust его реализует
- Как он взаимодействует с unsafe и FFI
План
Этот раздел должен занять около 1 часа 20 минут. В нём есть:
| Слайд | Длительность |
|---|---|
| Что такое закрепление | 5 минут |
| Определение Pin | 5 минут |
| PhantomPinned | 5 минут |
| Пример самоссылочного буфера | 50 минут |
| Pin | 15 минут |
«Pinning, то есть удержание адреса памяти значения в фиксированном месте, — одна из самых сложных концепций в Rust».
«Обычно его видят только в асинхронном коде, то есть в poll(self: Pin<&mut Self>), но применимость pinning шире».
Некоторые структуры данных трудно или невозможно написать без ключевого слова unsafe, включая самоссылающиеся структуры и интрузивные структуры данных.
Заметный связанный с этим сценарий — FFI с C++. Rust должен считать, что любой объект C++ со ссылкой может оказаться самоссылающейся структурой данных.
«Чтобы лучше понять этот конфликт, сначала нужно хорошо разобраться в семантике перемещения (move) в Rust».