fn main() {
let val = 0;
unsafe { foo(&val) }
}
extern "C" {
pub fn foo(val: *const u32);
}
在C中实施:
void foo(unsigned* val) { *val=1; }
当然,我应该通过val: *mut u32
,但是在我传递不可变引用的情况下会发生什么?什么编译器规则适用?即使我将指针传递给局部变量,val
仍保持不变吗?
答案 0 :(得分:6)
变异非可变数据 - 即通过共享引用或
let
绑定所拥有的数据到达的数据),除非该数据包含在UnsafeCell<U>
中。
这可能包括:
val
,它可能会忽略您所做的写入(例如,将值缓存在寄存器中或由于constant propagation)