为什么大多数 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 中不能保证指针的对齐,因此默认使用指针似乎是一个明智的选择
无论是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 中不能保证指针的对齐,因此默认使用指针似乎是一个明智的选择