Тип необработанного указателя для внутренней изменяемой структуры
Я делаю некоторую работу Rust FFI для API Erlang NIF, и у меня есть эти:
ErlNifEnv *enif_alloc_env();
void enif_free_env(ErlNifEnv* env);
Этот указатель ErlNifEnv передается множеству других функций, но пользователь никогда не разыскивает указатель. Кроме того, этот указатель не является потокобезопасным (использование среди нескольких потоков потребует мьютекса). Наивное представление Rust этого типа было бы..
struct ErlNifEnv;
*mut ErlNifEnv;
Но, я думаю, я могу относиться к этому типу как к "изменчивости интерьера", которая привела бы к…
struct ErlNifEnv;
*const ErlNifEnv;
Должен ли я рассматривать этот указатель как const, даже если базовый код C видит его как неконстантный?
1 ответ
Я лично считаю, что вы должны относиться к ним так же, как к ссылкам в самом Rust. Когда функция требует &mut
ссылка, очень вероятно, что это на самом деле изменит значение, и если это требует &
тогда естественно ожидать, что значение не изменится (конечно, без учета внутренней изменчивости).
В C нет различия между унаследованной и внутренней изменчивостью, поэтому вы можете выбрать, что использовать *mut
или же *const
исключительно на основе того, как функции C работают с этим значением. Фактически, в правильно написанном C API это различие будет присутствовать в виде const
классификаторы. Следовательно, если есть какие-либо функции, которые хотят изменить значение, перейдите с *mut
, Если таких функций нет (например, это неизменяемая структура, которая создается только один раз), выполните *const
, Это, конечно, относится к типу, который вы хотите сохранить в своей оболочке - в сигнатурах функций FFI вы всегда должны отражать сигнатуры C API.