C++(十八) — 内存模式、堆和栈
1、内存模式
一个程序执行时,先复制到内存,然后CPU逐句读取指令执行。
每个存储单元存放一个字节(8bit)数据,每个有一个唯一的地址,地址是顺序编码的。比如:一台计算机256MB内存,则有256*1024*1024个内存单元,如果用7位十六进制数表示地址值,则范围是:0x0000000~0xFFFFFFF。
内存分配:
- (1)代码区:存放程序代码;
- (2)全局数据区 或 静态变量区:全局变量 + 静态数据。存放长期数据的区域,从程序开始执行到结束,都会在内存中占有固定的字节;
- (3)栈区:局部变量。存放程序函数中的局部变量,就是,用到某个函数时,该函数定义的变量就存在栈区,退出时相应的变量会自动释放;还有特点:先进后出,即先进栈的变量后退出;
- (4)堆区:动态数据,指针。在程序执行过程中申请的内存空间,也要在程序结束时释放,否则内存泄漏;
2、变量存储位置、作用域
(1)全局变量
存储位置:全局数据区(程序结束后由系统释放);
作用域:全局作用域,只需在一个源文件中定义,作用所有;
周期:一直存在;
引用方式:其他文件使用时,用extern 关键字声明。(注意:不能两个文件中定义相同的名字,重定义了);
(2)静态变量
存储位置:全局数据区(程序结束后由系统释放);
作用域:文件作用域,在被定义的文件中;
周期:一直存在;
引用方式:static, const。(文件不相互包含,不同文件可定义完全相同的两个静态变量,是两个完全不同的变量)
(3)局部变量
存储位置:栈区。(编译器自动分配释放,存放函数参数值,局部变量值);
作用域:局部;
周期:程序运行出则销毁;
引用方式:
(4)静态局部变量
存储位置:全局数据区;
作用域:局部作用域;
周期:一直存在;
引用方式:static。(只被初始化一次)
(5)动态数据,指针
存储位置:堆区;
作用域:局部作用域;
周期:在程序执行中申请的内存空间,在程序结束中释放;
3、内存中的堆和栈
(1)申请方式、回收方式
- 栈:局部变量和参数,系统自动分配、回收;
- 堆:程序员分配释放,new/malloc,由os回收,分配方式类似于链表,如忘记释放,则内存泄漏;
(2)缓存方式
- 栈:一级缓存,由高地址向低方向增长(以地址增长方向为正);(存的局部变量,空间固定,栈内存是:先进后出)
- 堆:二级缓存,向高地址方向增长,(不连续内存空间);
(3)空间限制
- 栈:空间较小,是固定值;
- 堆:不连续内存,空间大且灵活;