局部静态变量

本文讨论了C++中局部静态变量的特性和行为,它们在函数首次调用时初始化,并在函数的整个生命周期中保持其状态。同时,解释了extern inline函数内的静态变量确保在所有翻译单元中引用的是同一对象。文章强调遵循标准的重要性,而非依赖实验猜测编译器行为,并提醒注意静态变量与自动变量的默认初始化差异。
摘要由CSDN通过智能技术生成

局部静态变量

局部静态变量更像是全局静态变量的一个语法糖一样的存在,只不过编译器会自动添加检查语句来将它的初始化延迟到对应函数的第一次调用时。 需要注意的是,一般的函数局部变量是放在栈上的,而局部静态变量是在 BSS 里的。

extern inline

§7.1.2/4 C++03 / C++11 / C++14

A static local variable in an extern inline function always refers to the same object.

很明确,如果是 extern inline 里的 static 变量,那么就一定是同一个对象。所以问题中的「编译器进行展开的话就有了多份static变量」不成立。

至于非「extern」的 inline 函数,已经是 internal linkage / no linkage 的函数了,不同翻译单元里的版本之间也已经是不相干的东西,和题目中的疑问不冲突了。

p.s. 明明有标准文档,为什么要通过各种「实验」来猜测结论呢?即便做实验、看汇编,忙了半天最后发现结果与标准里的描述不符,那么其实也只能是某个实现出错了,而不是标准出错了呀。编译器也要按照基本法嘛。

函数中静态变量

你可能想有这样一种变量:可以对它进行局部定义和访问,但是在退出声明它的代码块以后,它还能继续存在。换句话说,需要在一个代码块作用于内声明一个变量,但是要让它有静态存储时间。static说明符为您提供了这样的方法。

静态变量作用域时所在的代码块,但具有静态存储时间。

如果在声明一个静态变量时候没有初始化,那么程序将对它进行初始化。静态变量默认的初始值始终是0,它被转换成适合于该变量的类型。请记住,对于自动变量来说并非如此。

如果没有初始化自动变量,那么它们包含的数据将是最近使用它们所占用内存的程序留下来的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值