为什么大多数 ffi 函数使用原始指针而不是引用?

Why do most ffi functions use raw pointers instead of references?

无论是ffi教程还是自动生成的界面,大部分时间都使用*const T指针。据我所知 &T*const T 之间的区别只是 *const T 不必满足某些条件,例如不为 null 并且取消引用是不安全的。

fn main() {
    unsafe {
        do_something(&TestStruct {data: 3})
    }
}

#[repr(C)]
pub struct TestStruct {
    data: u32
}

extern "C" {
    fn do_something(arg: &TestStruct);
}

这段代码可以编译运行。因为外部函数与内部函数的用法相似,所以我不明白为什么默认使用裸指针。

或许可以从references must be aligned这个事实中找到答案的一个要素。由于使用 un-aligned 引用是未定义的行为,并且在 FFI 中不能保证指针的对齐,因此默认使用指针似乎是一个明智的选择