解析堆和栈的区别

H.264 入门篇 - 09 (帧间预测 - 参考帧列表) 短期和长期的关系和区别:在一个解码器中的 DPB(参考帧缓存)大小总是有限的,所以引入一个问题,什么样的参考帧会被保存到 DPB 中,什么样的参考帧会被移除出去,因此将分为长期和短期参考帧,所谓短期参考帧是这帧不会长期驻留在DPB中,如果参考帧缓存已满或者有其他特定的条件,那么短期参考帧就会被从DPB中移除;与之相对的长期参考帧,只要没有遇到某个指定的条件,遇到某个IDR帧, 遇到了清空整个DPB的指令等等,那么长期参考帧会长期在DPB中,不会因为有新的参考帧而被冲刷掉;(P帧是按照编码顺序) 阅读详情

一、预备知识

―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 

1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 

3、全局区(静态区)(static)―,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

 4、文字常量区 ―常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区―存放函数体的二进制代码。 

 二、例子程序 这是一个前辈写的,非常详细 

 //main.cpp 

 int a = 0; //全局初始化区 

 char *p1;// 全局未初始化区 

 main() 

 {

 int b; //栈 

 char s[] = "abc";// 栈

 char *p2; //栈 

 char *p3 = "123456"; //123456\0在常量区,p3在栈上。

 static int c =0; //全局(静态)初始化区 

 p1 = (char *)malloc(10); 

 p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。

 strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

 } 

 二、堆和栈的理论知识

 2.1申请方式 stack: 由系统自动分配。

 例如,声明在函数中一个局部变量 int b; 

系统自动在栈中为b开辟空间 

 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 

 在C++中用new运算符 如p2 = (char *)malloc(10); 

 但是注意p1、p2本身是在栈中的。

 2.2 申请后系统的响应

 栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 

 2.3申请大小的限制 

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

 2.4申请效率的比较: 

 栈由系统自动分配,速度较快。但程序员是无法控制的。 

 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 

另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。

 2.5堆和栈中的存储内容 

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 

 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 

 2.6存取效率的比较 

eg:   char s1[] = "aaaaaaaaaaaaaaa"; 

 char *s2 = "bbbbbbbbbbbbbbbbb"; 

 aaaaaaaaaaa是在运行时刻赋值的; 而bbbbbbbbbbb是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 

eg: 

 #include <stdio.h>

int main() 

 { 

 char a = 1; 

 char c[] = "1234567890";

 char *p ="1234567890"; 

 a = c[1]; 

 a = p[1]; 

 return 0;

 }

 对应的汇编代码 

 10:  a = c[1]; 

         00401067 8A 4D F1  mov cl,byte ptr [ebp-0Fh]

 0040106A 88 4D FC  mov byte ptr [ebp-4],cl 

 11: a = p[1]; 

 0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]

 00401070 8A 42 01   mov al,byte ptr [edx+1] 

 00401073 88 45 FC  mov byte ptr [ebp-4],al 

第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。 

 2.7小结: 

 堆和栈的区别可以用如下的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 

 使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大

【机器人】转动的指数坐标表示心得理解 转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需 阅读详情

相关推荐

从AD到HFSS:Gerber文件驱动的PCB三维电磁仿真全流程解析

本文详细解析了从AD到HFSS的Gerber文件驱动的PCB三维电磁仿真全流程,重点介绍了Gerber文件作为桥梁的重要性、AD端Gerber文件导出实战指南、HFSS 3D Layout导入技巧及高级问题排查方法。通过实际案例和技巧分享,帮助工程师高效完成PCB电磁仿真,提升设计验证效率。

weixin_33735077的博客 260

嵌入式开发中的堆与栈

关注、星标公众号,直达精彩内容文章内容出处:网路素材整理:李肖遥0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆...

李肖遥的专栏 5628

S7-200 Smart 控制运动轴(脉冲电机/伺服)教程

S7-200 Smart 控制运动轴(脉冲电机/伺服) 结合本人刚接触触摸屏时候的踩坑经验,编写S7-200 Smart 控制运动轴(脉冲电机/伺服)的详细流程,给刚接触PLC的朋友提供一些经验指导。 本文详细介绍了S7-200 Smart 控制脉冲步进/伺服电机流程,包含接线方法及梯形图。希望对初学者有所帮助

xjbsw0的博客 5万+

Java 数据结构 栈和队列的区别;栈和堆的区别 解析教程;

一、栈Stack 和 队列Queue 的区别 1.栈Stack 就像一个框,单出口, 先进后出 2.队Queue 列就像排队,双出口,先进先出 3. 实例代码参考 二、Java 堆Heap 和 栈 Stack的区别(Java的内存只有2种堆和栈,注意区分和数据结构和内存的区别) 1. 基本数据类型和引用变量的变量名都在栈中。 1.有哪些基本数据类型? 八大数据类型:int, short, lo...

半亩方糖 723

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

Python+AI能源管理实战:从电力负荷预测到智能调度的全流程开发

本系统展示了Python在能源管理领域的强大能力,通过AI技术实现了从预测到优化的智能决策闭环。随着碳中和目标的推进,智能能源系统将成为新型电力系统的核心大脑。📌 专业建议:系统部署需考虑网络安全防护,关键控制指令应设置多重验证机制!关注我的优快云账号获取能源系统安全最佳实践~下期预告:我们将探索Python在智慧医疗中的应用,开发基于多模态数据的智能诊断辅助系统。想提前获取代码?评论区留言"智慧医疗"获取GitHub源码链接!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 625

多线程中堆和栈区别的深入解析

很多现代操作系统中,一个进程的(虚)地址空间大小为4G,分为系统空间和用户空间两部分,系统空间为所有进程共享,而用户空间是独立的,一般WINDOWS进程的用户空间为2G。 一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(私有的)栈(stack),Windows线程的缺省堆栈大小为1M。堆(heap)的分配与栈有所不同,一般是一个进程有一个C运行时堆,这个堆为本进程中所有线程共享,Windows进程还有所谓进程默认堆,用户也可以创建自己的堆。 堆: 是大家共有的空间,分全局堆和局部堆。全.

u011555996的博客 1866

新代永久解锁西门子smart S7-200PLC 上传程序步骤

西门子 SMART S7-200 PLC 程序上传步骤 打开编程软件 或左下角依次打开 程序 所有程序 Siemens Automation Simatic STEP 7-MicroWIN SMART V2.4 STEP 7-MicroWIN SMART 技术交流 plcjiesuo1 2. 确认plc电源端以及输入电压; 3.用网线连接plc与电脑技术交流 plcjiesuo1 4.plc通电; 5.打开编程软件,双击通讯 6.按照...

m0_60773720的博客 2万+

java内存分配及堆和栈的区别和解析

java中内存分配策略及堆和栈的比较 java中内存分配策略及堆和栈的比较 2.1 内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现...

墨尔本,晴 176

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 814

Python爬虫:实时交通流量数据爬取与路况分析

随着城市化进程的不断推进,交通流量的管理与预测已成为智能交通系统的重要研究方向。交通流量数据不仅为城市交通管理提供了科学依据,还为驾驶员提供了实时路况信息,帮助其做出更加合理的出行决策。通过爬虫技术,我们可以实时获取城市的交通流量数据,从而分析路况,优化交通管理。在这篇博客中,我们将介绍如何使用Python编写一个爬虫来爬取实时交通流量数据,分析道路的交通状况。我们将使用最新的技术工具来构建爬虫,包括。

2201_76125261的博客 1268

堆和栈的区别及其在编程中的应用

理解它们的区别以及在编程中的应用,可以帮助我们写出更高效和可靠的代码。理解堆和栈的区别及其在编程中的应用,有助于编写更高效的代码。栈内存的管理是自动的,而堆内存的管理是手动的。栈内存的生命周期与函数调用的生命周期相关,函数返回时,栈内存会被自动释放。堆内存的生命周期与程序的生命周期相关,只有当程序显式释放堆内存时,内存才会被释放。堆是一种可动态分配和释放的内存区域,用于存储动态分配的数据。每次递归调用都会将局部变量和参数推入栈中,当递归结束时,栈中的这些数据会被自动释放。只是一个指向堆内存中对象的引用。

技术研究中心 425

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 比赛,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-比赛,华为OD机考-比赛。

qq_45776114的博客 1701

【C语言】堆和栈的区别

在不同情境下,堆和栈代表不同的含义。一般有两层含义:(1)程序内存布景场景下,堆和栈代表的是两种内存管理方式;(2)数据结构场景下,堆和栈表示两种常用的数据结构。 1.数据内存分布中的堆与栈 栈由操作系统自动分配释放,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。堆由程序员分配释放,若程序员不分配释放,程序结束时由操作系统回收,其分配方式类似于链表。...

PinkBananA_的博客 3596

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

内存中堆和栈的区别

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。 JVM内存的划分有五片: 寄存器; 本地方法区; 方法区; 栈内存; 堆内存。 我们重...

StarFishing 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java中堆和栈的区别

堆和栈都是Java用来在RAM中存放数据的地方。 堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。 栈 (1)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。 (2)栈的优势是,存取速

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 4204

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java中栈和堆的区别

栈(stack)和堆(heap)都是java 用来在RAM中存放数据的地方,与C++不同,java是自动管理栈和堆,程序员不能直接的设置栈和堆。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 堆 ...

没有到不了的明天 4688

一文搞懂堆和栈的区别

0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式。(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆与栈1.1 栈简介栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,其操作方式类似于数据结构中的栈。参考如下代码:int b;//栈//栈char *p2;//栈。

arvin_xiong的博客 2670

堆和栈的区别,变量存储在哪,函数存储在哪

好基础的问题,居然没答上来 一、程序内存的角度 堆和栈是两种不同的存储结构 1.1 栈简介 栈由操作系统(编译器)自动分配释放释放空间,用于存放函数的参数值、局部变量 int main() { int a; //栈 char s[] = "str"; //栈 char *p2; //栈 } 函数中定义的局部变量按照先后定...

juji_1100的博客 4705

内存中为什么分堆和栈,能否只用一种模型呢?为什么每个线程都有单独的栈

其实我们都知道,计算机内存本来就是一块内存,没有堆栈之分。 在学编程的时候,我们应该都听过一句话 “如果程序结束之后仍然想要访问那一段数据就要用堆(不释放的话,程序修改后的数据仍存在)”,我想这个其实就是本题目的关键了,堆和栈都有其自己的独特性,可能你了解这两个东西,但是我还是解释下,以免别的小伙伴在看答案的时候,不知道。 linux下一个进程中的所有线程共享该进程的地址空间,但它们有各自独立的(私有的)栈(stack)。堆(heap)的分配与栈有所不同,一般是一个进程有一个C运行时堆,这个堆为本进程中

jinking01的专栏 4996

单片机中堆和栈的区别

M0中的栈和堆 一、栈和堆空间的区别: (1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域...

jun8023qian的专栏 4878

堆(heap)和栈(stack)有什么区别?

一、Java内存模型 1.哪里用到了内存划分? (1)虚拟机执行Java代码时,首先要把字节码文件加载到内存,那么这些类的信息都存放在哪个区域呢? (2)当我们创建一个对象实例的时候,虚拟机要为对象分配内存,虚拟机是如何分配内存的呢? 2.Java内存模型(Java虚拟机的内存是如何划分的?虚拟机内存划分机制?) (1)程序计数器:是线程私有的,JVM支持多线程同时执行,存放当前正在...

Michaeles的博客 1728

堆和栈的区别——vector引发的思考

在使用vector这个结构的时候,如果vector在函数内部直接定义,则对象存储在栈上,数据存储在堆上;而通过new动态创建时,指针在栈上,对象和数据都在堆上。同时,at()方法提供了越界检查,但会带来额外的时间开销。无论哪种方式,vector的数据总是位于堆上。那么为什么会有堆和栈呢?本文将对堆和栈的区别,内存静态分配和动态分配,智能指针进行了介绍,总结一下就是堆可以对栈进行补充,动态分配内存,智能指针可以自动管理动态分配的对象,避免内存泄漏和资源未正确释放的问题。

c15901088098的博客 1540

iOS中堆和栈的区别

objective-c 对象所占内存总是分配在“堆空间”,并且堆内存是由你释放的,即release。 栈是由编译器管理自动释放的,在方法中(函数体)定义的变量通常在栈内。 1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注 堆和数据结构中的

WallaceWang_的博客 4200

C/C++堆和栈的区别

堆和栈的区别 1.管理方式不同 栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。 2.空间大小不同 栈的空间有限;堆内存可以达到4G,。 3.能否产生碎片不同 栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete 会造成内存的不连续,从而造成大量的碎片。 4.生长方向不同 堆的生长方式是向上的,栈是向下的。 5.分配方式不同 堆是动态分配的。栈可以是静态分配和动...

looklight的博客 1042

堆和栈的区别

一、预备知识―程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)― 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) ― 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(

Osmkcn 909
上一篇: void* unknown size问题及结构体转指针问题
下一篇: 案例研究:使用 ETW 和 Netmon 解决未知 USB 设备的问题
ByMain5123
博客等级 码龄16年 6粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值