在Rust中,有两种主要方式可以在程序执行期间存储不可变数据:const和static。
常量(const) 是在编译时计算的不可变值。它必须始终明确指定类型,并通过常量表达式初始化(可以在编译阶段计算的表达式)。常量在内存中没有固定地址,由编译器在使用位置“插入”。
const MAX_ATTEMPTS: u32 = 5;
静态变量(static) 在整个程序执行期间存储值于特定的内存区域。它的地址是固定的,并且可以是可变的(使用static mut),但由于在多线程场景中可能发生数据竞争,访问它时需要特别小心。
static APP_NAME: &str = "MyApp"; static mut COUNTER: u32 = 0;
const。static。
const和static在Rust中的区别是什么?静态变量可以引用非常量吗?
回答: 主要区别在于存储范围(生命周期):const不保证在内存中存在(这是值的替换),而static是一个在整个程序持续存在且地址固定的对象。
静态变量只能赋值为编译阶段已知的值:
let a = 42; // static INVALID: i32 = a; // 错误!仅允许常量。
故事
在负载均衡的后端服务项目中,一位开发者为不同线程使用static mut来共享请求计数器,但没有使用同步。这导致数据竞争和不可预测的结果——部分请求被丢失。解决方案是使用std::sync::atomic中的原子类型,或者Mutex。
故事
一位年轻的开发者决定通过const将用户欢迎消息提取为常量,但试图将其与在初始化时计算的函数结果关联。编译器报错,因为值必须在编译阶段定义。原因是常量必须在编译时可计算,而函数在运行时返回值。
故事
在一个旧项目中,所有全局值都被替换为static,忘记了字符串字面量的引用使用的是程序的内存区域,而一些声明实际上只需替换值:这增加了二进制文件的大小并加大了内存管理的复杂性。结果是启动时间的增长和在动态加载库时的内存泄漏。