Rust 引用如何存储在内存中(特别是堆栈)

Pan*_*der 2 rust rust-cargo borrow-checker

我一直在学习 Rust 中的引用,发现很难理解引用到底是如何存储在堆栈中的。

考虑下面的程序:

fn main() {
    let name = String::from("Somu");
    let name_ref = &name;
}
Run Code Online (Sandbox Code Playgroud)

现在,如何在堆栈帧中为这两个变量分配内存?

|--------------------|
| name     | 0x1fcd  |
|--------------------|
| name_ref | ?       |
|--------------------|
Run Code Online (Sandbox Code Playgroud)

因此,由于String存储在堆中,因此我们有堆的地址,其中字符串“Somu”作为变量的值出现name

现在,name_ref是对 的引用name。用 Rust 术语来说,name_ref借用 指向的值name

那么,什么 get 作为 的值存储在堆栈帧中呢name_ref

  • 包含字符串的堆内存的地址?
  • name堆栈中的地址?

或者是其他东西?

有人可以用这个概念丰富我吗?

提前致谢

Ale*_*uze 6

那么,什么 get 作为 name_ref 的值存储在堆栈帧中呢?

name堆栈中的地址。

引用是具有编译器在编译期间知道的一些附加属性的指针(可变性、别名、指向现有对象的保证、借用的生命周期等)。但最终它们只是引擎盖下的一个普通的旧指针。它们的大小为usize宽/粗指针除外)。并保存它们指向的东西的内存地址。

您可以通过使用格式打印指针的地址来验证这一点{:p}

fn main() {
    let name = String::from("Somu");
    let name_ref = &name;
    
    println!("{:p}", &name as *const _);
    println!("{:p}", name_ref);
    println!("{:p}", name.as_bytes() as *const _);
}
Run Code Online (Sandbox Code Playgroud)

例如,这可以输出:

0x7ffff3dd1350
0x7ffff3dd1350
0x55dfd62769d0
Run Code Online (Sandbox Code Playgroud)

其中第一个地址是堆栈变量的地址name,第三个地址是管理的堆分配的地址String