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)空间限制

  • 栈:空间较小,是固定值;
  • 堆:不连续内存,空间大且灵活;

 

posted @ 2018-12-17 21:55  深度机器学习  阅读(594)  评论(0编辑  收藏  举报