当前位置: 首页 > news >正文

RUST 每日一省:全局变量

Rust中允许存在全局变量。它们一般有两种:常数和静态值。

常量

        我们使用关键字 const 来创建常量。由于常量未使用关键字 let 声明,因此在创建它们时必须指定类型。常量只能进行简单赋值,并且没有固定的内存地址,无论它们在何处使用都会被内联。

        常量不能遮蔽,不能重复定义。也就是说,不存在内层或后面作用域定义的常量去遮蔽外层或前面定义的同名常量的情况。常量一旦定义后就永远不可变更和重新赋值。

const HEADER: u64 = 32;
fn main() {println!("{:?}", HEADER);
}

静态

        静态变量使用 static 关键字定义, 跟常量一样需要显式指明类型,静态变量的生命周期也是全局的,因为它具有固定的内存位置,并且在整个程序中作为单个(唯一)实例存在。

        静态变量并非被分配到栈中, 也不是在堆中, 而是和程序代码一起被存储于静态存储区中。 静态存储区是伴随着程序的二进制文件的生成(编译时) 被分配的, 并且在程序的整个运行期都会存在。

        静态变量默认同样不可修改,因此无法取得某个值的mut 引用。static 可以声明为 mut,但再访问它就是不安全的,需要使用unsafe。

static mut APPLE: u32 = 4;
static BANANA: u8 = 9;fn main() {unsafe {println!("APPLEis {}", APPLE);APPLE= 42;println!("APPLE is now {}", APPLE);println!("BANANAis {}", BANANA);}
}

对比

常量和静态变量非常相似,但它们之间存在一些微妙的区别:

        静态变量的值在内存中拥有固定的地址,使用它的值总是会访问到同样的数据。与之相反的是,常量则允许在任何被使用到的时候复制其数据。另外一个区别在于静态变量是可变的。需要注意的是,访问和修改可变的静态变量是不安全的 。

        如果你不需要依赖静态的单例属性及其预定义的内存位置,而只需要其具体值,那么应该更倾向于使用常量。它们允许编译器进行更好的优化,并且更易于使用。

lazy_static

        全局值只能在初始化时声明非动态的类型,并且在编译期,它在堆栈上的大小是已知的。例如,你不能将 HashMap 创建为静态值,因为它涉及堆分配。幸运的是,我们可以使用 HashMap 和其他动态集合类型(如 Vec)构造全局静态值,这是通过被称为lazy_static 的第三方软件包实现的。它暴露了 lazy_static!宏,可用于初始化任何能够从程序中的任何位置全局访问的动态类型。

use std::sync::Mutex;
lazy_static! {static ref ITEMS: Mutex<Vec<u64>> = {let mut v = vec![];v.push(9);v.push(2);v.push(1);Mutex::new(v)}
}

        使用 lazy_static!宏声明的元素需要实现 Sync 特征。这意味着如果某个静态值可变,那么必须使用诸如 Mutex 或 RwLock 这样的多线程类型。

        使用 lazy_static! 会在每次访问静态数据时造成微小的性能损失,因为其实现使用了为一次性初始化而设计的一个低级同步原语 std::sync::Once。在后台,每次访问懒静态数据,程序都要执行一次原子加载指令以检查初始化是否完成。

http://www.lryc.cn/news/169328.html

相关文章:

  • Arduino与Proteus仿真-WiFi网络仿真环境搭建
  • 陪诊系统|陪诊软件革新医疗体验
  • 零基础Linux_5(开发工具_上)yum和vim和gcc/g++和gdb
  • mysql建表的时候设置默认值为null会对存储和索引有影响吗?
  • 通过API爬取到的淘宝商品详情数据展示(api测试入口)
  • 蓝桥杯2023年第十四届省赛真题-买瓜--题解
  • python萌新爬虫学习笔记【建议收藏】
  • 网络编程——基础知识
  • flutter聊天界面-TextField输入框实现@功能等匹配正则表达式展示高亮功能
  • 【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式
  • Java集合之HashSet接口
  • uniapp----微信小程序 日历组件(周日历 月日历)【Vue3+ts+uView】
  • 【记录】深度学习环境配置(pytorch版)
  • 如何将项目推送到GitHub中
  • 数据库直连提示 No suitable driver found for jdbc:postgresql
  • Stability AI推出Stable Audio;ChatGPT:推荐系统的颠覆者
  • HTML中的<canvas>元素
  • 【论文阅读】MARS:用于自动驾驶的实例感知、模块化和现实模拟器
  • Leetcode 2856. Minimum Array Length After Pair Removals
  • 深入了解Vue.js框架:构建现代化的用户界面
  • 力扣 -- 673. 最长递增子序列的个数
  • 43.248.189.X网站提示风险,存在黑客攻击页面被篡改,改如何解决呢?
  • Java8中判断一个对象不为空存在一个类对象是哪个
  • 项目:点餐系统
  • ElasticSearch 5.6.3 自定义封装API接口
  • 企业架构LNMP学习笔记51
  • rom修改----安卓系列机型如何内置app 如何选择so文件内置
  • SpringMvc中的请求转发和重定向
  • Oracle,高斯创建自增序列
  • 操作系统学习笔记-精简复习版