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

6

在ffi教程和自动生成的接口中,大多数情况下使用*const T指针。据我所知,&T*const T之间的区别仅在于*const T不必满足某些条件,如非空,并且不安全地解引用。

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

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

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

这段代码可以编译并运行。由于外部函数的使用方法类似于内部函数,我不明白为什么在默认情况下使用原始指针。

我认为这只是风格问题,因为FFI是不安全的,所以我倾向于使用原始指针。因此,我投票将其关闭为基于观点的问题。 - Chayim Friedman
1个回答

2

答案的一部分可能可以在这个事实中找到:引用必须对齐。因为使用不对齐的引用是未定义的行为,并且指针的对齐不能在FFI中保证,所以默认使用指针似乎是一个明智的选择。


这很有道理,但这是否只适用于从外部函数返回的指针呢?外部函数以一个不必对齐的指针作为参数,而引用是对齐的,但这对另一侧的 C 代码并不是问题。问题只会在从外部函数返回非对齐指针并将其解释为引用时出现。 - Goldenprime
4
另一个要注意的点是,如果一个值被不可变地借用,编译器保证其不会改变。然而,当将指针(即使是不可变的)传递给 ffi 函数时,由于在 C/C++ 中很容易突变数据,这样的保证是不可能的。 - gmoshkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接