困惑是正常的,‘static 生命周期约束本来就不简单

@
'static 生命周期约束总给人一种不好拿捏的感觉,因为它出现在不同位置上时含义也会有所不同,需要仔细甄别。此外,它还总会和其他一些机制关联着一起出现,比如闭包、Fn trait、生命周期约束以及多线程场景,这会增加理解的困难度,所以,对 'static 感到困惑是正常的。本文会带领大家全面了解一下 'static 生命周期约束。本文原文链接:《困惑是正常的,‘static 生命周期约束本来就不简单》
1. 从 static 变量谈起
static X: i32 = 42;
const Y: i32 = 42;
跟其他语言一样,static 变量的根本特征是:它的数据会被写进程序的数据段(.rodata / .data / .bss),进程启动时会装载到内存中,然后一直持续到程序结束,内存位置都不会发生变动。
所以,通常来说,static 变量是全局性的,但这不是绝对的。应该这样说:static 变量具备成为全局变量的条件,但是否是全局的取决于声明它的位置,因为,除了可以在 module 级别声明外,我们也可以在一个函数的局部作用域中声明一个 static 变量,它同样是放在数据段,运行时加载进内存的,只不过,它声明的作用域限制了它的“可见性”。
经常与 static 变量一起比较的是 const 常量,static 变量有自己确切的内存地址,可以对它:取引用、取地址,而 const 常量更像是它代表的那个值的“别名”,它没有自己的内存地址,在编译时,遇到使用到它的地方,编译器会就地物化一份这个值。
2. 'static 生命周期约束
'static 表示其标记对象的生命周期是程序的整个运行期,也就是说这个对象在程序运行期间会一直存活,结合它所处的“上下文”(所处的位置),'static 可以出现在四种位置上,以及一种容易被认为是可能的位置,但实际上是不允许的,以下是具体描述和示例:
完整阅读请移步原文:《困惑是正常的,‘static 生命周期约束本来就不简单》

浙公网安备 33010602011771号