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

RUST 静态生命周期和动态生命周期

图例

分配在堆和栈上的内存有其各自的作用域,它们的生命周期是动态的

全局变量、静态变量、字符串字母量、代码等内容,在编译时,会被编译到可执行文件中的 BSS/Data/RoData/Text 段,然后在加载时,装入内存

因而,它们的生命周期和进程的生命周期一致,所以静态的

所以,函数指针的生命周期也是静态,因为函数在Text 段中,只要进程活着,其内存一直存在

静态生命周期

概述

静态生命周期 Rust 中最长的生命周期,表示引用在整个程序运行期间都有效。这些数据通常存储在程序的只读内存区域,在程序启动时创建,在程序结束时销毁

特点

  1. 数据存在于整个程序运行期间
  2. 通常存储在静态内存区域
  3. 不需要运行时生命周期检查
  4. 最安全的引用类型

示例

// 字符串字面量具有 'static 生命周期letstatic_str:&'staticstr="Hello, World!";// 静态变量也具有 'static 生命周期staticSTATIC_INT:i32=42;letstatic_ref:&'statici32=&STATIC_INT;// 函数返回 'static 生命周期fnget_static_str()->&'staticstr{"This string lives for the entire program"}// 在结构体中使用 'static 生命周期structStaticHolder{data:&'staticstr,}implStaticHolder{fnnew()->Self{StaticHolder{data:"This data lives forever",}}}fnmain(){letholder=StaticHolder::new();println!("{}",holder.data);lets=get_static_str();println!("{}",s);// 这些引用可以在任何地方使用,不会出现悬垂引用letlong_lived_ref=static_str;println!("{}",long_lived_ref);}

动态生命周期

概述

动态生命周期是指哪些在编译时无法确定具体持续时间,需要在运行时通过检查器验证的生命周期

这些生命周期通常与作用域相关,由编译器推断或通过生命周期参数明确指定

特点

  1. 生命周期在编译不确定,需要运行时检查
  2. 与特定作用域绑定
  3. 需要生命周期注解来帮助编译器验证安全性
  4. 更灵活,但需要更多编译器支持

例子

// 函数接受两个引用并返回一个引用,需要明确生命周期参数fnlongest<'a>(x:&'astr,y:&'astr)->&'astr{ifx.len()>y.len(){x}else{y}}// 结构体包含引用,需要生命周期参数structTextEditor<'a>{content:&'astr,selection:&'astr,}impl<'a>TextEditor<'a>{fnnew(content:&'astr)->Self{TextEditor{content,selection:"",}}fnselect(&mutself,start:usize,end:usize){self.selection=&self.content[start..end];}}fnmain(){// 动态生命周期的示例letstring1=String::from("long string is long");letstring2=String::from("short");letresult;{// 这两个引用有不同的生命周期letpart1=&string1;letpart2=&string2;// longest 函数要求两个参数有相同的生命周期 'aresult=longest(part1,part2);println!("The longest string is: {}",result);}// part1 和 part2 在这里离开作用域// result 仍然有效,因为它引用的是 string1 或 string2 的一部分// 而 string1 和 string2 仍然在作用域内println!("Still can use: {}",result);// 文本编辑器示例letcontent=String::from("This is a long text content for the editor");letmuteditor=TextEditor::new(&content);editor.select(5,15);println!("Selection: {}",editor.selection);// 如果尝试在 content 离开作用域后使用 editor,会导致编译错误// {// let local_content = String::from("local");// let local_editor = TextEditor::new(&local_content);// // local_editor 不能离开这个作用域,因为它的引用依赖于 local_content// }// println!("{:?}", local_editor); // 这会编译错误}

总结

特性静态生命周期 ('static)动态生命周期
持续时间整个程序运行期间由作用域决定
内存位置静态内存区域栈或堆
安全性绝对安全需要编译器验证
灵活性
使用场景字符串字面量、静态变量函数参数、结构体字段
http://www.jsqmd.com/news/1275839/

相关文章:

  • 技术架构深度解析:sto/stock量化交易平台的数据驱动设计范式
  • app测试|面试常问工作常用的adb命令集
  • 北京产业园哪家注册费用低:博亚信诚科技费用亲民 - 18002239949
  • Google Zero趋势下SEO策略转型:从爬虫优化到用户与AI服务
  • 百万行CSV占满内存:流式读取如何保持统计一致
  • Rust的错误处理
  • ADC081C021/C027 I2C接口8位SAR ADC:硬件报警与低功耗设计详解
  • 2026 郑州黄金回收全避坑指南 拆解虚报金价克扣套路 - 奢侈品回收评测
  • BBWEYY机械制造行业独立站建设策划案,含零代码SAAS、AI编程、源码定制交付
  • 泛程序心得:小白建站超简单
  • 如何构建企业级自动化任务调度系统:QLScriptPublic终极实战指南
  • Newcar数学模块教程:用NumberPlane和Tex组件实现数学可视化
  • 计算机毕业设计之SpringBoot的火车站售票管理系统的设计与实现
  • 北京产业园哪家能挂靠注册地址:博亚信诚科技地址可靠 - 18102756859
  • Claude 4.8 Debug能力实测:跨文件调用链追踪与根因分析
  • “卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
  • 气动元器件选型(精密版)
  • 2026哈尔滨工程棉被厂家选购指南:5个避坑要点+4条硬标准,帮你绕开90%的坑 - mobible
  • alexa-smarthome设备发现流程全解析:协议与实现指南
  • 计算机毕业设计之基于SpringBoot的婚庆服务系统的设计与实现
  • 2026黑龙江防火棉被销售厂家选购指南!5个标准+8个问答,帮你找准源头厂 - mobible
  • 打造智能桌面伙伴:开源虚拟宠物框架完全指南
  • 【Bug已解决】RuntimeError: shape mismatch during KV cache init with EP + DP on MoE model 解决方案
  • 2026中医主治医师考试培训机构优选!阿虎医考综合实力突出 - 医考机构品牌测评专家
  • 德聚众心是不是直销公司?一文讲清健康管理品牌的真实运营模式 - GrowUME
  • SSM毕设项目: 基于SSM的精益研究课题全过程管理系统企业精细化管理课题运维分析系统设计 (源码+文档,讲解、调试运行,定制等)
  • Logseq Anki Sync 终极指南:如何实现知识卡片的高效同步
  • 2026黑龙江防火棉被公司选购指南:5个挑选要点,帮你绕开90%的坑 - mobible
  • 默认值就是h。 一般来说controller runtime框架、knative框架,都会默认这个值为h。不同的是,controll ...
  • 广州写字楼装修公司排行:5家合规服务商盘点 - 互联网科技品牌测评