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

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

图例

请添加图片描述

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

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

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

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

静态生命周期

概述

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

特点

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

示例

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

动态生命周期

概述

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

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

特点

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

例子

// 函数接受两个引用并返回一个引用,需要明确生命周期参数
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() {x} else {y}
}// 结构体包含引用,需要生命周期参数
struct TextEditor<'a> {content: &'a str,selection: &'a str,
}impl<'a> TextEditor<'a> {fn new(content: &'a str) -> Self {TextEditor {content,selection: "",}}fn select(&mut self, start: usize, end: usize) {self.selection = &self.content[start..end];}
}fn main() {// 动态生命周期的示例let string1 = String::from("long string is long");let string2 = String::from("short");let result;{// 这两个引用有不同的生命周期let part1 = &string1;let part2 = &string2;// longest 函数要求两个参数有相同的生命周期 'aresult = longest(part1, part2);println!("The longest string is: {}", result);} // part1 和 part2 在这里离开作用域// result 仍然有效,因为它引用的是 string1 或 string2 的一部分// 而 string1 和 string2 仍然在作用域内println!("Still can use: {}", result);// 文本编辑器示例let content = String::from("This is a long text content for the editor");let mut editor = 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.dtcms.com/a/434574.html

相关文章:

  • Rocky Linux 8 远程管理配置指南(宿主机 VNC + KVM 虚拟机 VNC)
  • 北京网站快速备案建站手机网站
  • 第四章 信息系统管理
  • 【开发日记】记一次公司服务器中Redis服务问题排查
  • linux问题10--克隆后ip地址和源linux主机相同
  • 社交网站模版steam交易链接怎么改
  • AI重塑销售管理,突破“人”的能力边界|纷享AI主题研讨会宁波站圆满落幕
  • [C++项目组件] 后台服务器部署docker
  • 移动固态优盘坏道读写速率下降等测试
  • 解决django.db.utils.OperationalError: attempt to write a readonly database问题
  • Django SimpleUI 配置与优化详解
  • 从入门到精通:Django的深度探索之旅
  • 【数据结构】考研重点掌握:顺序查找算法实现与ASL计算详解
  • 大型网站建立1800做网站因为专业
  • 医疗AI平台化转型:从单点试点到体系化建设的互操作性与质量控制路径研究(上)
  • 做装修效果图的网站沈阳哪有wordpress
  • Linux命令行指令返回值data空降Python的机枪与大炮(DeepSeek)
  • c++中this指针使用bug
  • 网站源码中国有限公司外贸网站建设怎么制作
  • 哪家公司做网站专业安装wordpress主题放哪里
  • 我们为什么要封装 localStorage
  • 【AI论文】LongLive:实时交互式长视频生成
  • 企业网站推广总结网站降权是什么意思
  • 消息队列(面试)
  • Presto:一款免费开源的大数据SQL查询引擎
  • AI驱动的软件测试变革:从自动化框架到智能决策
  • The 2024 ICPC Asia Nanjing Regional Contest(2024南京区域赛EJKBG)
  • 面试场景题-
  • 怎样接做网站的活做校园网站代码
  • 【github】秘钥