静态变量(static)

  • C++ 中,static 关键字可用于不同类型的变量:静态全局变量、静态局部变量和静态成员变量
  • 多线程下,静态全局变量、静态局部变量和静态成员变量无论初始化是否安全,访问和修改变量时都需要使用互斥锁或其他同步机制保护
  • 静态全局变量和静态局部变量初始化过程是线程安全的
  • 静态局部变量在C++11 及以后标准初始化是线程安全的,之前不安全

静态全局变量

  • 静态全局变量:使用 static 关键字修饰的全局变量
  • 生命周期:从程序开始到程序结束
  • 初始化:在 main 函数之前初始化,初始化过程是线程安全的,如果没有显式初始化,其值取决于数据类型和编译器的行为
  • 作用域:仅限于声明文件内部,不能被其他文件访问
  • 共享性:多个函数可以直接共享这个静态全局变量,不需要通过函数参数传递
  • 注意:虽然初始化过程是线程安全的,但在多线程中同时访问和修改变量时存在数据竞争或未定义行为。因此,在多线程中需要使用互斥锁或其他同步机制保护
#include <vector>
#include <thread>
static int counter = 0;  // 全局静态变量    在所有 CStaticLocalVariable 类的实例之间共享
//static std::atomic<int> counter = 0;      //原子操作同步
class CStaticGlobalVariable
{
   
   
public:
	void ParallelAddition()
	{
   
   
		std::vector<std::thread> vecThread(10);
		for (
### 静态变量 `static` 的可修改性及作用域规则 #### 可修改性 静态变量(无论是局部静态还是全局静态)在其生命周期内是可以被修改的。一旦初始化完成,静态变量在整个程序运行期间都会保留其值[^1]。对于局部静态变量而言,在每次调用函数时会保持上一次的值;而对于全局静态变量,则可以在同一源文件内的不同函数间共享并更新。 #### 行为特性 - **局部静态变量的行为** 定义于函数体内部的静态变量仅在第一次进入该函数时会被初始化,并且之后每一次重新进入此函数时都保存着上次退出前的状态。这种机制使得它可以用来记录某些累积状态或者计数器等功能。 - **全局静态变量的作用域限制** 当声明一个带有关键字 `static` 的全局变量时,它就变成了具有文件作用域而非真正的全局作用域。也就是说,这样的变量只能由同一个翻译单元(translation unit),也就是同一个`.c` 文件中的代码访问到,而无法通过外部链接让别的 `.c` 文件里的函数直接存取这个变量。 以下是展示如何定义和操作这两种类型的静态变量的例子: ```c // global_static.c #include <stdio.h> // 全局静态变量, 只能在本文件中使用. static int gs_counter = 0; void increment_global_static() { ++gs_counter; } int get_global_static_value() { return gs_counter; } // 局部静态变量演示 void local_static_example() { // 这是一个局部静态变量, 初始只会在首次调用时发生. static int ls_count = 0; printf("Local Static Count is %d\n", ++ls_count); } ``` 上述例子展示了两种形式的静态变量及其基本的操作方式。注意这里的 `gs_counter` 被标记为了 `static`, 所以即使提供了获取数值的方法 (`get_global_static_value`) ,也无法简单地从另一个编译单位(C source file) 中改变或读取它的实际内容。 #### 总结 综上所述,无论是在函数体内作为局部变量存在还是位于全局区域成为一种特殊用途的数据成员,带 `static` 关键字修饰符的变量都是可以被更改的实体对象。它们的主要区别在于生存时间和可见范围的不同设定上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值