Rust中声明时借用引用与传参时借用引用是否存在差异?
两种写法的差异与术语说明
给定函数:
fn do_something(i: &i32) { println!("{i}"); }
你提到的两种写法运行时输出一致,但底层存储逻辑和生命周期存在本质区别:
1. 核心差异:存储位置与生命周期
第一种写法:
let a = &5; do_something(a);
这里的5是整数字面量,Rust会将它存入程序的静态内存区(数据段),这块内存的内容在程序整个运行周期内都不会被释放。因此a是一个指向'static生命周期i32值的引用,你可以把a赋值给生命周期更长的变量,甚至作为函数返回值(只要函数签名标注&'static i32),借用检查器不会限制它的使用范围。第二种写法:
let b = 5; do_something(&b);b是栈上的局部变量,5被存储在栈内存中,&b是对这个栈变量的借用引用,它的生命周期严格绑定到b的作用域——一旦b所在的代码块执行结束,b会被栈自动销毁,此时再使用这个引用就会触发借用检查器的报错。
2. 术语澄清
两种场景里的a和&b都属于引用类型,但可以按指向目标区分:
let a = &5;中的a是存储静态字面量引用的变量,这个引用指向静态内存中的值。&b是指向栈上局部变量的临时引用,它是一个临时生成的引用值,传递给函数时完成自动借用。
你提到的"reference variable"指的是存储引用的变量(比如这里的a),"reference to a variable"指的是指向某个变量的引用(比如&b)——这两个概念不是一回事,但都属于Rust引用体系的范畴。
内容的提问来源于stack exchange,提问作者crass_sandwich
相关产品推荐
相关产品推荐

