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堆栈中的地址?或者是其他东西?
有人可以用这个概念丰富我吗?
提前致谢
那么,什么 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。
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |