В чем разница между &mut Foo и *mut Foo?

В моей программе на Rust я получаю значения формы *mut Foo из функции, написанной на C.

let x: *mut Foo = my_ffi_function();

Что вообще означает это обозначение «*mut»?

Насколько я могу судить, x — это просто указатель на изменяемую структуру Foo, такой же, как &mut Foo.

Этот код компилируется отлично:

    let mut s: String = String::new();
    let x: &mut String = &mut s;
    let y: *mut String = x;

В чем разница между двумя формами?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

*mut — это необработанный изменяемый указатель, который может иметь значение null и которым можно манипулировать C-подобными способами, например. с приведением, где &mut — это ссылка, гарантированно не равная нулю и имеющая гораздо больше ограничений.

На практике большинство полезных вещей, которые вы можете сделать с *mut, потребуют unsafe контекста, поэтому, если это вообще возможно, избегайте их или, если это не удастся, сузьте небезопасную область действия (например, обернув вызовы интерфейса FFI функциями Rust, которые получают указатель, проверьте его на достоверность и преобразуйте его в тип Rusty, обычно это либо ссылка, либо Box-тип, либо Option-обертка ссылки, чтобы сохранить «обнуляемость», одновременно предоставляя вызывающей стороне безопасный интерфейс для защиты от разыменования нулевого указателя, и позволяя вызывающему абоненту оставаться в безопасном режиме Rust вместо сброса полезных средств защиты).

Ответ принят как подходящий

&mut Foo — это ссылка , а *mut Foo — это указатель.

Во время выполнения это, по сути, одно и то же; просто адрес какого-то другого места в памяти.

Разница в том, что ссылки проверяются компилятором и всегда должны быть действительными (указывать на выделенное, ненулевое, выровненное, инициализированное значение). Чтобы помочь в этом, ссылочный тип также имеет связанное с ним время жизни (с аннотацией &'lifetime mut Foo), которое используется компилятором на этапе проверки заимствования. Это основной механизм, с помощью которого Rust обеспечивает безопасность памяти.

Напротив, компилятор не проверяет корректность указателей. Указатели могут быть нулевыми, они могут указывать на неправильно выровненные данные или вообще не указывать на какое-либо значение. Из-за этого в безопасном Rust с помощью указателей можно сделать очень мало, и поэтому доступ через указатель должен осуществляться внутри блока unsafe. Обычно этого следует избегать, поскольку код unsafe сложно получить правильно, но он может потребоваться в сложных или чувствительных к производительности сценариях (или часто в FFI).

Ваш блок кода просто демонстрирует, что ссылки можно преобразовать в указатели.

Также указатели обычно называют «необработанными указателями».

Chayim Friedman 30.05.2024 16:43

Другие вопросы по теме