对于共享引用和可变引用,语义是明确的:只要您具有对值的共享引用,其他任何内容都不能具有可变访问权限,并且不能共享可变引用.
所以这段代码:
#[no_mangle]
pub extern fn run_ref(a: &i32, b: &mut i32) -> (i32, i32) {
let x = *a;
*b = 1;
let y = *a;
(x, y)
}
Run Code Online (Sandbox Code Playgroud)
编译(在x86_64上):
run_ref:
movl (%rdi), %ecx
movl $1, (%rsi)
movq %rcx, %rax
shlq $32, %rax
orq %rcx, %rax
retq
Run Code Online (Sandbox Code Playgroud)
请注意,内存a指向只读一次,因为编译器知道写入b必须没有修改内存
a.
原始指针更复杂.原始指针算术和强制转换是"安全的",但取消引用它们不是.
我们可以将原始指针转换回共享和可变引用,然后使用它们; 这肯定意味着通常的引用语义,编译器可以相应地进行优化.
但是如果我们直接使用原始指针,那么语义是什么?
#[no_mangle]
pub unsafe extern fn run_ptr_direct(a: *const i32, b: *mut f32) -> (i32, i32) {
let x = *a;
*b = 1.0; …Run Code Online (Sandbox Code Playgroud) rust ×1