Ответ 1
Что пиннинг?
При программировании закрепление X означает указание X не двигаться.
Например:
- Привязка потока к ядру процессора, чтобы он всегда выполнялся на одном CPU,
- Закрепление объекта в памяти, чтобы предотвратить сборщик мусора для его перемещения (например, в С#).
Что такое тип Pin
?
Назначение типа Pin
заключается в том, чтобы связать объект с памятью.
Он позволяет принимать адрес объекта и иметь гарантию того, что этот адрес останется действительным до тех пор, пока экземпляр Pin
остается в живых.
Что это за дела?
Основная утилита, для которой она была разработана, поддерживает генераторы.
Идея генераторов состоит в том, чтобы написать простую функцию с yield
, а компилятор автоматически перевести эту функцию в конечный автомат. Состояние, которое несет генератор, представляет собой "стек" переменных, которые необходимо сохранить от одного вызова к другому.
Основная сложность генераторов, для которых Pin
предназначена для исправления, заключается в том, что генераторы могут в конечном итоге хранить ссылку на один из своих собственных членов данных (в конце концов, вы можете создавать ссылки на значения стека) или ссылку на объект, в конечном счете принадлежащий их собственным данных (например, a &T
полученных из Box<T>
).
Это подканал самореферентных структур, которые до сих пор требовали настраиваемые библиотеки (и много unsafe
). Проблема самореферентных структур заключается в том, что если перемещение структуры, содержащаяся ссылка все еще указывает на старую память.
Pin
видимому, Pin
решает этот многолетний вопрос о ржавчине. Как тип библиотеки. Это создает дополнительную гарантию того, что до тех пор, пока Pin
существует, закрепленное значение не может быть перемещено.
Поэтому использование состоит в том, чтобы сначала создать нужную структуру, вернуть ее/переместить по желанию, а затем, когда вы удовлетворены своим местом в памяти, инициализируйте закрепленные ссылки.