C++理论梳理5——变量的存储类型(作用域、生命周期和链接性)

chapter 1——存储类型

变量的存储类型指的是给变量分配内存的方法,如:自动存储,静态存储,动态存储和线程存储。存储类型可以用作用域/生命周期和链接性进行描述。

自动存储:在函数内部定义的变量使用自动存储空间,是一个局部变量作用域是包含它的代码块(代码块是花括号中的一段代码)。自动变量通常存储在栈stack中(后进先出)
静态存储:是在整个程序执行期间都存在的存储方式。有3中:外部连结性(多个文件共享,在代码块外声明且其他文件用extern访问)、内部链接性(只能在当前文件中访问,在代码块外声明并加static)、无链接性(只能在当前代码块中访问,在代码块内声明)
动态存储:使用new和delete定义的存储变量,存放于堆heap中。其生命周期只受new和delete控制。
线程存储:TBD

作用域:就是一个变量可以被引用的范围,如:文件作用域(单个文件内部全局可访问)、局部作用域(代码块内部可访问)
生命周期:就是这个变量可以访问的时间段
链接性:多个文件间的数据共享。

// main.cpp
int a=1;	// 这是定义变量,该变量可文件间共享,整个程序运行期间都存在
static int b=2;		// 只有本文件可访问,整个程序运行期间都存在
const int c=3;		// 只有本文件可访问,整个程序运行期间都存在

void main()
{
	int d=4;	// 只有该函数可访问,函数结束后变量内存释放
	static int e=5;		// 只有该函数可访问,整个程序运行期间都存在
	
}
// func.cpp
extern int a;	// 这是声明变量,引用外部文件定义的数据

void func()
{
	/*********************/
}

从另一个角度可这样理解:

chapter 2——变量类型

全局变量

  • 作用域:全局作用域(全局变量只需在一个源文件中定义,其他源文件声明即可使用,详见声明与定义
  • 生命周期:程序运行期一直存在
  • 引用方法:其他文件对要使用的全局变量进行extern关键字声明。
  • 内存分布:全局数据区
  • 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义
int i;		//声明并定义
extern int i;	//声明
extern int i=10; 		//定义

全局静态变量

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

局部变量

  • 作用域:局部作用域(只在局部作用域中可见)
  • 生命周期:程序运行出局部作用域即被销毁 ,如函数内部
  • 内存分布:栈区

静态局部变量

  • 作用域:局部作用域(只在局部作用域中可见)。
  • 生命周期:程序运行期一直存在
  • 内存分布:全局数据区
  • 定义方法:局部作用域用中用static定义 (比如用于:被调函数返回指针:此时用static定义的变量在函数调用结束后不释放,可将该static变量的地址作为返回值)
  • 注意:只被初始化一次,多线程中需加锁保护

总的来讲:

  • 变量的作用域、生命周期和链接性本质是内存管理问题,一个程序的内存分为代码区、全局数据区、堆区、栈区等
  • 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度。

chapter 3——内存解释

内存解释:如下图
在这里插入图片描述在这里插入图片描述
当一个程序被加载到主内存中时,它通常被组织成四个内存区域,称为段:代码段、数据段、堆栈段和堆段。

代码段:有时也称为文本段。它包含可执行指令(机器代码)。代码段通常是只读的。
数据段:数据段分为两部分:初始化数据段:所有全局、静态和常量数据都存储在数据段中;未初始化数据段:所有未初始化的全局变量和静态变量都存储在该段中,也称为BSS段。
堆段:当程序在运行时使用calloc和malloc函数分配内存时,内存在堆中分配。
堆栈段:堆栈用于存储局部变量、函数参数和其他与函数相关的信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值