Я хочу создать C FFI API для своего ящика, но неясно, насколько безопасно использовать указатели.Псевдокод:
#[no_mangle]
extern "C" fn f(...) -> *mut c_void {
let t: Box<T> = ...;
let p = Box::into_raw(t);
p as *mut c_void
}
Это работает, как и ожидалось, но насколько это безопасно?В C или C ++ есть специальный указатель void *
, и стандарт C ++ объявляет, что его можно безопасно привести к нему.Потенциально, sizeof(void *)
может быть не равно sizeof(T *)
, но есть гарантия, что sizeof(void *)
> = sizeof(T *)
.
А как насчет Rust?Есть ли какая-либо гарантия относительно std::mem::size_of
указателя или безопасного приведения между указателями?Или все указатели имеют одинаковый размер по реализации, равный usize
?
Под «универсальным» я подразумеваю, что вы можете конвертировать X *
, не теряя ничего.Меня не волнует информация о типах;Меня интересуют разные размеры указателей на разные вещи, такие как near
/ far
указатели в 16-битных днях.
4.10 говорит:
Результат преобразования "указатель на cv T «указатель на cv void» указывает на начало хранилища, в котором находится объект типа T,
Невозможно, чтобы sizeof(void *) < sizeof(T *)
, потому что тогда этоневозможно иметь реальный адрес места хранения.