全局变量和静态全局变量区别(转载)

本文详细解释了静态全局变量与普通全局变量的区别,特别是在作用域和初始化方面的不同。同时对比了静态局部变量与普通局部变量的特点。

static全局变量与普通的全局变量有什么区别?全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果.

 
C++中全局变量静态全局变量存在多方面的区别: ### 作用全局变量作用域是整个程序,在一个源文件中定义的全局变量,可通过 `extern` 关键字在其他源文件中声明并使用。静态全局变量作用域仅限于定义它的源文件,其他源文件无法访问该变量,即使使用 `extern` 声明也不行。例如: ```cpp // file1.cpp #include <iostream> int globalVar = 10; // 全局变量 // file2.cpp #include <iostream> extern int globalVar; // 声明全局变量 void printGlobalVar() { std::cout << "Global variable value: " << globalVar << std::endl; } // file3.cpp #include <iostream> static int staticGlobalVar = 20; // 静态全局变量 void printStaticGlobalVar() { std::cout << "Static global variable value: " << staticGlobalVar << std::endl; } ``` 在上述代码中,`globalVar` 可以在 `file2.cpp` 中通过 `extern` 声明后使用,而 `staticGlobalVar` 只能在 `file3.cpp` 中使用 [^2]。 ### 链接属性 全局变量具有外部链接属性,在链接阶段,不同源文件中同名的全局变量会被视为同一个变量。如果不同源文件定义了同名的全局变量,在链接阶段会出现“符号重定义”错误。静态全局变量具有内部链接属性,不同源文件中同名的静态全局变量会被视为不同变量,所以不同源文件的静态全局变量可以重名 [^2]。 ### 声明定义方式 全局变量只能在源文件定义,如果定义在头文件,头文件可能被多个源文件 `include`,会导致多个源文件定义同名的全局变量,最终在链接时报“符号重定义”错误。全局变量在头文件只能声明,使用 `extern` 声明全局变量,其他源文件 `include` 该头文件,相当于这些源文件都声明了该全局变量,就可以直接使用。静态全局变量可以在头文件中定义,如果头文件被多个源文件 `include`,相当于这些源文件定义了同名的静态全局变量,但这些静态全局变量是不同变量,不能实现数据的共享 [^2]。 ### 存储位置 全局变量静态全局变量存储静态存储区。初始化的全局变量静态全局变量存于静态存储区的数据段,未初始化的存于BSS段(Block Started by Symbol) [^2][^4]。 ### 生命周期 全局变量静态全局变量的生命周期都是从程序开始运行到程序结束 [^2]。 ### 线程安全 全局变量本身不具备线程安全特性,在多线程环境下访问修改全局变量时,需要额外的同步机制来保证线程安全。静态全局变量如果是在单例模式下使用静态局部变量实现,在C++11之后,编译器会保证静态局部变量的初始化是线程安全的,但会有默认加锁解锁的开销;而饿汉式单例(可借助全局变量实现)天生线程安全,无需加锁 [^3]。 ### 初始化时机 全局变量在程序启动时就会被初始化。静态全局变量如果是静态局部变量形式,会在第一次使用该变量时进行初始化;如果是普通静态全局变量,也是在程序启动时初始化 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值