C++:堆和栈的理解

C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区

:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。

栈的话,可以理解为你去住客栈,客栈是有老板的,老板管理着客栈的资源,他会给你决定住的那间房,你退房的时候,他会自动给你自动的清理你住过的房间的痕迹,给下一个用户住。

:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。

可以这样理解由new新建的内存,存放在堆里,相当于你新建了一个房子,拆迁由你定,不时也会有政府强制给你拆迁

自由存储区:是由malloc等分配的内存块,和堆十分相似,用free来释放。

全局/静态存储区:全局变量和静态变量被分配到同一块内存中(在C语言中,全局变量又分为初始化的和未初始化的,C++中没有这一区分)。

常量存储区:这是一块特殊存储区,里边存放常量,不允许修改。
(注意:堆和自由存储区其实不过是同一块区域,new底层实现代码中调用了malloc,new可以看成是malloc智能化的高级版本)

堆与栈的区别:
管理方式:堆中资源由程序员控制(容易产生memory leak), 栈资源由编译器自动管理,无需手工控制。

空间大小: 堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit 系统理论上是4G),所以堆的空间比较灵活,比较大。栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在 编译时确定,VC中可设置)。

碎片问题:对于堆,频繁的new/delete会造成大量碎片,使程序效率降低。 对于栈,它是一个先进后出的队列,进出一一对应,不会产生碎片。

生长方向堆向上,向高地址方向增长。栈向下,向低地址方向增长

分配方式: 堆都是动态分配(没有静态分配的堆)。栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配),动态分配由alloca函数 分 配,但栈的动态分配的资源由编译器进行释放,无需程序员实现。

分配效率:堆由C/C++函数库提供,机制很复杂。所以堆的效率比栈低很多。栈是极其系统提供的数据结构,计算机在底层对栈提供支持,分配专门 寄存 器存放栈地址,栈操作有专门指令。

C++:堆和栈的理解相关推荐

  1. 堆和栈的理解 堆和栈的区别 什么是堆和栈 堆是什么 栈是什么

    场景出现于; 在列表(表格)渲染的时候,渲染完毕 点击表格中的每个修改按钮 定义一个空对象,this.details = {} 拿到每个表格中的item[i] 赋值给详情 this.details = ...

  2. JS中的堆和栈怎么理解?

    JS中其实是没有堆和栈的概念的,但是为了方便我们理解代码的执行过程以及执行方式,我们可以设想这么一个概念: JS把简单的数据类型存放到了栈里,在栈里直接开辟一块空间存放值: 那么复杂数据类型呢? JS ...

  3. 【转载】iOS堆和栈的理解

    操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:"text segment ","stack segmen ...

  4. 进程、线程、堆、栈的理解和区别!

    一:进程和线程的定义 (1)进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.  (2)线程是进程的一个实体,是CPU调度和分派的基本单位,它是 ...

  5. *关于C++堆和栈的理解

    栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等.             堆:就是那些由new分配的内存块,他们的释放编译器不去管,由 ...

  6. 定义入栈java_Java堆和栈你敢说了解吗?看完这个文章再有底气说吧

    Java中堆和栈的理解要求特别深刻,所以我们重点写了一个堆和栈的区别的文章,方便大家理解和应用. JAVA,内存模型中堆和栈的区别 在了解Java堆和栈的区别之前,我们先了解一下内存分配策略. JAV ...

  7. Java虚拟机:Java中堆和栈的详细区别

    一.Java中内存分配策略: 在比较堆和栈的区别之前,我们先了解下Java的内存分配策略,按照编译原理的观点,程序运行时的内存分配有三种策略,分别是:静态的,栈式的,和堆式的. (1)静态存储分配:是 ...

  8. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

    理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 ...

  9. java的栈堆的理解_理解堆与栈 - 一步一个脚印 - BlogJava

    一.引言: 一直不太明白堆与栈到底是什么,是指一块内存区呢,还是指一种数据结构?编写程序中总提到内存分配的栈与堆的区别,静态与动态分配等,总也弄不明白,隐约知道一点,但总分不清堆与栈到底是一块内存区还 ...

最新文章

  1. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名
  2. IIS6 MVC3 配置
  3. 二叉搜索树c/c++代码实现
  4. Oracle二三事之 12c 可插拔数据库PDB
  5. Java SE 8 在并发工具方面的加强
  6. Docker默认网络管理
  7. sql判断字段不为null_什么是NULL值
  8. java项目 字典实现,java项目中数据字典的实现
  9. charles(青花瓷)抓包配置mac ios版,详细好用
  10. 设计模式之单例模式:饿汉模式(懒汉模式)及优缺点分析
  11. 让ImageMagick支持png和jpeg格式
  12. css实现六边形图片(最简单易懂方法实现高逼格图片展示)
  13. RAW图像详解及使用Python读取raw格式图像并显示
  14. 微信小程序:全新动态视频壁纸下载支持多种分类短视频另外也有静态壁纸
  15. ZYNQ学习之路19.在SDx中使用xfOpenCV图像加速处理
  16. 黄建宏-redis多机数据库
  17. 新网站建设的完整步骤
  18. bulldog2 靶机渗透
  19. 快应用的用法和常见问题解答(上)
  20. 在iOS应用中使用字体图标及制作字体库

热门文章

  1. 安装opensips时创建MySQL表_Centos7.6安装opensips并实现通话成功
  2. Kafka不丢失数据与不重复消费数据
  3. 三、路由协议——直连路由、静态路由、缺省路由、路由优先级和路由度量、路由冗余和备份(浮动静态路由)
  4. android自定义Dcloud插件,调用android原生界面并获取返回数据
  5. 从伯努利分布到交叉熵(一)
  6. 【pytorch】yolov4 实现对蛾子数据集的识别 以及 对蛾子图片二值化处理 实现 自动打标签标注。(本文重点在自动实现将图片转化为voc数据集)
  7. NVL()、NVL2() 函数的用法
  8. 1 error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 void __cdecl InitD3D(struct HWND__ *)
  9. 盘点庚子年里,火到出圈的人工智能应用
  10. Android自定义圆形调色板,可设置属性