面试题答案
一键面试- 内存分配区别
const
:const
声明的常量在编译时就确定其值,并且它的值会被内联到使用它的地方。它不占据任何运行时的内存空间,因为编译器会在编译阶段把所有对const
常量的引用替换为其实际值。这意味着,在运行时,没有专门为const
常量分配的内存区域。- 例如:
const PI: f64 = 3.14159;
fn main() {
let r = 5.0;
let area = PI * r * r;
// 这里编译器会直接将PI替换为3.14159进行计算,运行时无PI的内存空间
}
static
:static
声明的静态变量在程序的整个生命周期内存在,它在程序启动时被分配内存,并且一直占用该内存直到程序结束。static
变量有一个固定的内存地址,在整个程序中是唯一的。- 例如:
static COUNTER: i32 = 0;
fn main() {
println!("The value of COUNTER is: {}", COUNTER);
// COUNTER在程序启动时分配内存,在整个程序生命周期内存在
}
- 可变性
const
:const
常量始终是不可变的。static
:虽然默认情况下static
变量是不可变的,但可以使用mut
关键字声明可变的static
变量。不过,由于static
变量有固定的内存地址,在多线程环境下对可变static
变量的访问需要额外的同步机制(如Mutex
)来避免数据竞争。例如:
static mut COUNTER: i32 = 0;
fn main() {
unsafe {
COUNTER += 1;
println!("The value of COUNTER is: {}", COUNTER);
}
}
这里使用unsafe
块是因为对可变static
变量的修改需要绕过Rust的常规安全检查,以处理潜在的数据竞争问题。