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)空间限制
- 栈:空间较小,是固定值;
- 堆:不连续内存,空间大且灵活;
C++(十八) — 内存模式、堆和栈的更多相关文章
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- JVM内存的堆、栈和方法区
JVM的内存分为堆.栈.方法区和程序计数器4个区域 存储内容:基本类型,对象引用,对象本身,class,常量,static变量 堆: 拥有者:所有线程 内容:对象本身,不存放基本类型和对象引用 垃圾回 ...
- 内存,堆,栈,heap,stack,data
1. 基本类型占一块内存. 引用类型占两块. 2. 类是静态概念. 函数中定义的基本类型变量和对象的引用类型变量都在函数的栈内存. 局部变量存在栈内存. new创建的对象和数组,存在堆内存. java ...
- java中的内存空间 堆和栈
认识堆与栈 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过 ...
- JVM内存结构之堆、栈、方法区以及直接内存、堆和栈区别
JVM内存结构之堆.栈.方法区以及直接内存.堆和栈区别 一. 理解JVM中堆与栈以及方法区 堆(heap):FIFO(队列优先,先进先出):二级缓存:*JVM中只有一个堆区被所有线程所共享:对象和数 ...
- 理解java虚拟机内存分配堆,栈和方法区
栈:存放局部变量 堆:存放new出来的对象 方法区:存放类的信息,static变量,常量池(字符串常量) 在堆中,可以说是堆的一部分 创建了一个student类,定义了name属性, id静态变量 ...
- JVM内存初学 堆、栈、方法区
转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解J ...
- C#设计模式之十八状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...
- java内存上堆和栈的一些理解
多线程上的基本类型:https://blog.csdn.net/championhengyi/article/details/76857401
随机推荐
- python - 常用的小方法
常用的小方法: bin() oct() hex() chr() ord() dir() id() len() int() str() type() help() range(10) / rang ...
- 【Linux】Ubuntu下录屏&&制作GIF
在做Android的时候,想制作GIF用来演示效果.一番摸索.找到了一个简单可行的办法: App在模拟器中执行,用录屏软件录制.再将视频转成GIF. 系统: Ubuntu 15.04 录屏软件: Re ...
- Python高级教程-返回函数
函数作为返回值 高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回. 要实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 ...
- BeanUtils.copyProperties()
BeanUtils.copyProperties() PropertyUtils.copyProperties() 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同). 后付前 P ...
- mysql第二天作业
create database 数据库名 default charset utf8;use 数据库名;1.创建成绩表,字段包括:学生姓名,语文成绩,数学成绩,英语成绩create table resu ...
- smarty基础原理
smarty基础原理 一.html模板页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- python+selenium+API
一.浏览器操作 1.浏览器最大化 driver.maximize_window() #将浏览器最大化显示 2.设置浏览器宽.高 driver.set_window_size(480, 800)#设置浏 ...
- Github 的其他用法
一.概述 Github 除了作为代码托管库外,有趣的程序员们还利用它解锁了有趣的新姿势. 二.新姿势 2.1 Github Pages 可以为项目建立静态主页(即gh-pages分支), 也可以建立命 ...
- jQuery幻灯片播放器插件
在线演示 本地下载
- 正式学习React(四) ----Redux源码分析
今天看了下Redux的源码,竟然出奇的简单,好吧.简单翻译做下笔记: 喜欢的同学自己可以去github上看:点这里 createStore.js import isPlainObject from ' ...