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

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

C++(十八) — 内存模式、堆和栈的更多相关文章

  1. 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...

  2. 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

    设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...

  3. JVM内存的堆、栈和方法区

    JVM的内存分为堆.栈.方法区和程序计数器4个区域 存储内容:基本类型,对象引用,对象本身,class,常量,static变量 堆: 拥有者:所有线程 内容:对象本身,不存放基本类型和对象引用 垃圾回 ...

  4. 内存,堆,栈,heap,stack,data

    1. 基本类型占一块内存. 引用类型占两块. 2. 类是静态概念. 函数中定义的基本类型变量和对象的引用类型变量都在函数的栈内存. 局部变量存在栈内存. new创建的对象和数组,存在堆内存. java ...

  5. java中的内存空间 堆和栈

        认识堆与栈 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过 ...

  6. JVM内存结构之堆、栈、方法区以及直接内存、堆和栈区别

    JVM内存结构之堆.栈.方法区以及直接内存.堆和栈区别 一.  理解JVM中堆与栈以及方法区 堆(heap):FIFO(队列优先,先进先出):二级缓存:*JVM中只有一个堆区被所有线程所共享:对象和数 ...

  7. 理解java虚拟机内存分配堆,栈和方法区

    栈:存放局部变量 堆:存放new出来的对象 方法区:存放类的信息,static变量,常量池(字符串常量) 在堆中,可以说是堆的一部分   创建了一个student类,定义了name属性, id静态变量 ...

  8. JVM内存初学 堆、栈、方法区

    转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解J ...

  9. C#设计模式之十八状态模式(State Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...

  10. java内存上堆和栈的一些理解

    多线程上的基本类型:https://blog.csdn.net/championhengyi/article/details/76857401

随机推荐

  1. 贪玩ML系列之一个BP玩一天

    手写串行BP算法,可调batch_size 既要:1.输入层f(x)=x  隐藏层sigmoid 输出层f(x)=x 2.run函数实现单条数据的一次前馈 3.train函数读入所有数据for循环处理 ...

  2. [luogu4234]最小差值生成树

    [luogu4234]最小差值生成树 luogu 从小到大枚举边,并连接,如果已连通就删掉路径上最小边 lct维护 \(ans=min(E_{max}-E_{min})\) #include<b ...

  3. Flask(1)- 主流web框架、初识flask

    一.Python 现阶段三大主流Web框架 Django.Tornado.Flask 对比 Django 主要特点是大而全,集成了很多组件(例如Models.Admin.Form等等), 不管你用得到 ...

  4. mysql大数据查询优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  5. PHP数组的创建

    案例: 仔细看代码,PHP创建数组 <?php $names[0]='Peter'; $names[1]='Minot'; $names[2]='Smith'; echo $names[0].' ...

  6. Python(正则 re模块)

    1. 匹配一个字符 表达式 说明 等价表达式 \d 数字 [0-9] \w 字母.数字.下划线 [a-zA-Z0-9_] . 除换行外任意字符   \s 空格 [\t\n\r\f\v] \D 除数字 ...

  7. Python(函数式编程)

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  8. grads 新老版本目录对比

    最近不少人都在使用OpenGrADS,最新的版本已经更新到了2.0.a9,具体grads做了哪些更新,在附件里面放了一个,是英文的. 很多人说在使用原来的一些教程的时候找不到相对应的文件夹了,其实仔细 ...

  9. Number使用笔记

    Numbe函数用于将对象转换为数字 0          0 null       0 空  0 ""         0 true      1 false     0 date ...

  10. Android 6.0中在/dev下添加新设备驱动下Selinux相关设置【转】

    本文转载自:https://blog.csdn.net/fantasy_wxe/article/details/52013922 错误1: 07-23 13:06:57.617   117   117 ...