MST

星途 面试题库

面试题:Rust中const与static在内存分配上的区别

请详细阐述在Rust语言里,`const`和`static`声明的变量在内存分配方面有何不同,并举例说明。
40.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 内存分配区别
    • 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在程序启动时分配内存,在整个程序生命周期内存在
}
  1. 可变性
    • constconst常量始终是不可变的。
    • 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的常规安全检查,以处理潜在的数据竞争问题。