今天在论坛上看到有朋友发帖问道:既然静态全局变量与全局变量都存储在全局数据区,为什么作用域却不一样呢?也许答案非常简单:C++就是这么规定的,静态全局变量与全局变量的唯一区别就是作用域不同。对一个C++变量来说,有两个属性非常重要:作用域和生命周期,它们从两个不同的维度描述了一个变量--时间和空间。顾名思义,作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域;而生命周期就是这个变量可以被引用的时间段。不同生命周期的变量,在程序内存中的分布位置是不一样的。一个程序的内存分为代码区、全局数据区、堆区、栈区,不同的内存区域,对应不同的生命周期。有很多方法来指定一个变量的作用域和生命周期。最常见的,如:{ }、static修饰符等。下面按照作用域与生命周期来对变量做一个分类:

全局变量

作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件。)
生命周期:程序运行期一直存在
引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量。
内存分布:全局数据区
注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义
例子:

//defime.cpp
int g_iValue = 1;//main.cpp
extern int g_iValue;int main()
{cout << g_iValue;return 0;
}

全局静态变量

作用域:文件作用域(只在被定义的文件中可见。)
生命周期:程序运行期一直存在
内存分布:全局数据区
定义方法:static关键字,const 关键字
注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量
例子:

const int iValue_1;
static const int iValue_2;
static int iValue_3;int main()
{return 0;
}

静态局部变量

作用域:局部作用域(只在局部作用域中可见)
生命周期:程序运行期一直存在
内存分布:全局数据区
定义方法:局部作用域用中用static定义
注意:只被初始化一次,多线程中需加锁保护
例子:

void function()
{static int iREFCounter = 0;
}

局部变量

作用域:局部作用域(只在局部作用域中可见)
生命周期:程序运行出局部作用域即被销毁
内存分布:栈区
注意:auto指示符标示
还有一点要说明,掌握static关键字的使用很关键。以下是引用别人的一些经验之谈:

Tips:

若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题,因为他们都放在静态数据存储区,全局可见;
如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

————————————————
版权声明:本文为CSDN博主「yunyun1886358」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yunyun1886358/article/details/5632087

C++中变量的生命周期相关推荐

  1. c++中的异常---2(异常接口声明,异常变量的生命周期,异常的多态使用)

    异常接口声明 为了加强程序的可读性,可以在函数声明中列出可能抛出异常的所有类型,例如:void func() throw(A,B,C);这个函数func能够且只能抛出类型A,B,C及其子类的异常 如果 ...

  2. java 中 bean 的生命周期

    java 中 bean 的生命周期 本篇中会对涉及到的知识点皆做出描述: 首先,我们先了解先虚拟机的类加载机制: 虚拟机把描述类的数据从Class 文件中加载到内存,并对数据进行校验.转换解析和初始化 ...

  3. Android静态变量的生命周期

    Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的时候分配内存的,并且存在于方法区.当类 被卸载的时候,静态变量被销毁.在PC机的客户端程序中, ...

  4. JVM详解之:汇编角度理解本地变量的生命周期

    文章目录 简介 本地变量的生命周期 举例说明 优化的原因 总结 简介 java方法中定义的变量,它的生命周期是什么样的呢?是不是一定要等到方法结束,这个创建的对象才会被回收呢? 带着这个问题我们来看一 ...

  5. C/C++构造及析构顺序及变量的生命周期

    (1)变量的构造及析构顺序 1)在全局范围内定义的对象(即在所有函数之外定义的对象),它的构造函数在文件中的所有函数(包括main函数)执行之前调用.如果一个程序中有多个文件,而不同文件之间都定义了全 ...

  6. java中的的一些生命周期,Java中对象的生命周期

    Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...

  7. C++异常(异常的基本语法、栈解旋unwinding、异常接口声明、异常变量的生命周期、异常的多态使用、C++系统标准异常库)

    文章目录 1 异常的基本概念 1.1 C语言中的异常处理 1.2 C++中的异常处理 1.3 异常严格类型匹配 2 栈解旋(unwinding) 3 异常的接口声明[C++11已废弃] 4 异常变量的 ...

  8. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  9. C#中对象的生命周期

    c#中的对象生命周期 类 是定义在代码文件中,保存在硬盘上 ,是对象的蓝本,它描述了对象在内存中大概是什么样子的. 对象: 我们都知道.net将值类型存储在栈中,引用类型存储在堆中,这样做的原因是栈中 ...

最新文章

  1. H5新增的标签以及改良的标签
  2. IBM超越谷歌抵达量子计算里程碑:研制出50量子位计算机
  3. 2019年年初iOS招人心得笔记(附面试题)
  4. Hibernate 关联映射 之 多对多 关联(二) 之拆分
  5. C、C++的学习───思维方式的转变(2)
  6. 信息安全技术 linux,信息安全技术题库:Linux系统是一种类Unix系统。( )
  7. C语言中的各输出格式含义
  8. php 单例模式原理,PHP单例模式demo详解
  9. python web前端开发面试_面试前端,听听别人怎么说!
  10. MVC系列博客之排球计分(六)Controller的实现(二)
  11. 加号和减号在一起怎么读_幼儿园怎样认识加号,减号,等于号
  12. LOJ10099矿场搭建
  13. Android超炫图片浏览器代码
  14. starbase 数据库使用 (miRNA预测LncRNA)
  15. adb 连接逍遥游模拟器搭配monkey命令 抓取 logcat日志
  16. 什么是zigbee?
  17. BZOJ1006神奇的国度
  18. 无法嵌入互操作类型“Application Class”请改用适用的接口
  19. 解决突然跳出命令行(闪烁)
  20. 什么是ACCESS端口?此端口如何处理数据帧?

热门文章

  1. ATE测试之DC测试
  2. 深圳市弘辽科技:快速提高淘宝直通车关键词质量分的技巧
  3. 老程序员的辛酸,猛投简历半年无果
  4. 自建CDN防御DDoS(3):架构的后续改进
  5. 解决classNotFound的问题的思路
  6. 数据存储单位转换,b、byte、KB、MB、GB、TB转换工具类
  7. TIDB手动降级(原版本v6.0.0,重装v5.4.1)
  8. LongBit 新一轮 IEO 引领者?
  9. Java程序员去找工作,如何写好一份漂亮的简历,给你借鉴一下
  10. JS错误:Mixed Content: The page at ‘https://XXX’ was loaded over HTTPS, but requested an insecure 新的问题