小编Ste*_*fan的帖子

解除引用原始指针的语义是什么?

对于共享引用和可变引用,语义是明确的:只要您具有对值的共享引用,其他任何内容都不能具有可变访问权限,并且不能共享可变引用.

所以这段代码:

#[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

11
推荐指数
1
解决办法
979
查看次数

标签 统计

rust ×1