chapter 1——存储类型
变量的存储类型指的是给变量分配内存的方法,如:自动存储,静态存储,动态存储和线程存储。存储类型可以用作用域/生命周期和链接性进行描述。
自动存储:在函数内部定义的变量使用自动存储空间,是一个局部变量作用域是包含它的代码块(代码块是花括号中的一段代码)。自动变量通常存储在栈stack中(后进先出)静态存储:是在整个程序执行期间都存在的存储方式。有3中:外部连结性(多个文件共享,在代码块外声明且其他文件用extern访问)、内部链接性(只能在当前文件中访问,在代码块外声明并加static)、无链接性(只能在当前代码块中访问,在代码块内声明)动态存储:使用new和delete定义的存储变量,存放于堆heap中。其生命周期只受new和delete控制。线程存储:TBD
作用域:就是一个变量可以被引用的范围,如:文件作用域(单个文件内部全局可访问)、局部作用域(代码块内部可访问)生命周期:就是这个变量可以访问的时间段链接性:多个文件间的数据共享。
// main.cppinta=1;// 这是定义变量,该变量可文件间共享,整个程序运行期间都存在staticintb=2;// 只有本文件可访问,整个程序运行期间都存在constintc=3;// 只有本文件可访问,整个程序运行期间都存在voidmain(){intd=4;// 只有该函数可访问,函数结束后变量内存释放staticinte=5;// 只有该函数可访问,整个程序运行期间都存在}
// func.cppexterninta;// 这是声明变量,引用外部文件定义的数据voidfunc(){/*********************/}
从另一个角度可这样理解:
chapter 2——变量类型
全局变量
- 作用域:全局作用域(全局变量只需在一个源文件中定义,其他源文件声明即可使用,详见声明与定义)
- 生命周期:程序运行期一直存在
- 引用方法:其他文件对要使用的全局变量进行extern关键字声明。
- 内存分布:全局数据区
- 注意:如果在两个文件中都定义了相同名字的全局变量,连接出错:变量重定义
inti;//声明并定义externinti;//声明externinti=10;//定义
全局静态变量
- 作用域:文件作用域(只在被定义的文件中可见)
- 生命周期:程序运行期一直存在
- 内存分布:全局数据区
- 定义方法:static关键字,const 关键字(const和inline定义一般放在.h中,且不和extern配合使用。)
- 注意:只要文件不互相包含,在两个不同的文件中是可以定义完全相同的两个静态变量的,它们是两个完全不同的变量
局部变量
- 作用域:局部作用域(只在局部作用域中可见)
- 生命周期:程序运行出局部作用域即被销毁 ,如函数内部
- 内存分布:栈区
静态局部变量
- 作用域:局部作用域(只在局部作用域中可见)。
- 生命周期:程序运行期一直存在
- 内存分布:全局数据区
- 定义方法:局部作用域用中用static定义 (比如用于:被调函数返回指针:此时用static定义的变量在函数调用结束后不释放,可将该static变量的地址作为返回值)
- 注意:只被初始化一次,多线程中需加锁保护
总的来讲:
- 变量的作用域、生命周期和链接性本质是内存管理问题,一个程序的内存分为代码区、全局数据区、堆区、栈区等
- 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度。
chapter 3——内存解释
内存解释:如下图
当一个程序被加载到主内存中时,它通常被组织成四个内存区域,称为段:代码段、数据段、堆栈段和堆段。
代码段:有时也称为文本段。它包含可执行指令(机器代码)。代码段通常是只读的。数据段:数据段分为两部分:初始化数据段:所有全局、静态和常量数据都存储在数据段中;未初始化数据段:所有未初始化的全局变量和静态变量都存储在该段中,也称为BSS段。堆段:当程序在运行时使用calloc和malloc函数分配内存时,内存在堆中分配。堆栈段:堆栈用于存储局部变量、函数参数和其他与函数相关的信息。
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容