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

Gol*_*ime 6 ffi rust raw-pointer

无论是在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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码可以编译并运行。因为外部函数的用法与内部函数类似,所以我不明白为什么在那里使用原始指针作为默认值。

Mag*_*gix 2

答案的一个要素也许可以从引用必须对齐这一事实中找到。由于使用未对齐的引用是未定义的行为,并且在 FFI 中无法保证指针的对齐,因此默认使用指针似乎是一个明智的选择

  • 另一点是,如果一个值被不可变地借用,则编译器保证它不会改变。然而,当将指针(甚至是不可变的指针)传递给 ffi 函数时,这种保证是不可能的,因为例如在 C/C++ 中改变数据是多么容易 (4认同)