内存
- 程序代码区用来保存指令,常量区、全局数据区、堆、栈都用来保存数据
- 常量区和全局数据区有时也被合称为静态数据区,意思是这段内存专门用来保存数据,在程序运行期间一直存在
- 函数被调用时,会将参数、局部变量、返回地址等与函数相关的信息压入栈中,函数执行结束后,这些信息都将被销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部,因为它们的内存不在了
- 常量区、全局数据区、栈上的内存由系统自动分配和释放,不能由程序员控制。程序员唯一能控制的内存区域就是堆(Heap):它是一块巨大的内存空间,常常占据整个虚拟空间的绝大部分,在这片空间中,程序可以申请一块内存,并自由地使用(放入任何数据)。堆内存在程序主动释放之前会一直存在,不随函数的结束而失效。在函数内部产生的数据只要放到堆中,就可以在函数外部使用
- 在32位环境下,Windows 默认会将高地址的 2GB 空间分配给内核(也可以配置为1GB),而将剩下的 2GB 空间分配给用户程序
- 对于64位程序,内核占用最高的 248TB,用户程序占用最低的 8TB
- 每个线程的栈都是独立的,所以一个进程中有多少个线程,就有多少个对应的栈,对于 Windows 来说,每个线程默认的栈大小是 1MB
- 一个可执行程序就是一个进程,前面我们使用C语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间
- 程序是存储在磁盘上的一个文件,是指令和数据的集合,是一个静态的概念;进程是程序加载到内存运行后一些列的活动,是一个动态的概念
变量
1、变量属性:
- 数据类型:整型,浮点型
- 存储类别:静态,动态
2、变量分类:
- 空间:作用域(局部,全局)
- 时间:存储期(静态,动态)
3、内存空间划分:
- 静态存储区(全局变量,加static声明的局部变量)
- 动态存储区(函数形参,未加static声明的局部变量)
静态存储区中的变量,在程序执行过程中占据固定的存储单元
动态存储区中的变量,调用开始时分配存储空间,函数结束时释放空间
4、几种实际的变量定义:
- 动态局部变量:函数中的一般变量
- 静态局部变量:在函数中加static声明的变量
- [静态]全局变量:加static声明的全局变量,只能用于本文件
注:
- 全局变量均为静态存储,加static只是限制了作用范围,也不存在动态全局变量的说法
- extern只用于声明已定义的全局变量,不能用于变量的定义
- 内部/外部变量是相对于函数来说的,相当于局部/全局变量
- 实际使用中的意义在于:函数调用时临时为变量分配存储单元(省内存);变量可被其他文件引用(省代码)
参考:
c++中变量分类
- https://blog.csdn.net/u013921430/article/details/79279114
- https://wenku.baidu.com/view/747cf817b307e87101f696aa.html