首页 > 其他分享 >堆和栈的区别?

堆和栈的区别?

时间:2024-06-05 09:32:20浏览次数:26  
标签:区别 系统 动态分配 链表 地址 内存 分配

空间大小:

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

创建方式:

堆是通过malloc/new出来的,必须通过手动free/delete来释放;而函数的运行,函数的局部变量都是在栈上的,系统自动分配的,出作用域以后系统自动回收

管理方式

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

生长方向:

堆向上,向高地址方向增长。栈向下,向低地址方向增长。,也就是说堆的地址是低地址-》高地址,栈的地址是高地址-》低地址;栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量。

系统响应:

对于堆,系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆结点,删除空闲结点链表中的该结点,并将该结点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配的大小,这样delete才能正确释放本内存 空间,另外系统会将多余的部分重新放入空闲链表中)。对于栈,只要栈的剩余空间大于所申请空间,系统为程序提供内存,否则报异常提示栈出。

碎片问题:

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

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

分配方式:

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

分配效率:

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

标签:区别,系统,动态分配,链表,地址,内存,分配
From: https://blog.csdn.net/m0_73537205/article/details/139426800

相关文章

  • winxp与win7启动的区别
    事情:C盘下安装了xp,I盘下安装了win7,由于种种原因,重装了xp,Windows7的引导项就没有了,开机直接进入xp系统,无奈~~于是拼命找解决方法,首先想到的就是修改boot.ini文件,奈何没有用,因为win7启动根本不读取boot.ini(你就算删了它win7照样正常启动,但xp启动不了)boot.ini是2000xp2003......
  • 鸿蒙系统和MIUI之类的系统有何区别?
    文章目录2套鸿蒙系统MIUI或HyperOSHarmonyOS2套鸿蒙系统HarmonyOS(鸿蒙操作系统)是华为开发的一种面向全场景的分布式操作系统,设计初衷是为了实现不同设备间的无缝协同,提供一致的用户体验。它支持智能手机、智能穿戴、智慧屏、车机、智能家居等多种终端设备。Harmon......
  • golang 的 net/http 和 net/rpc 的区别, rpc 效率比 http 高?
     在Go语言中,net/http和net/rpc是两个不同的包,它们分别用于实现不同的网络通信模式:net/http:net/http包主要用于构建Web服务和客户端,它实现了HTTP协议,这是互联网上最广泛使用的应用层协议之一,主要用于传输超文本(HTML)和其他资源。HTTP协议是基于请求-响应模型的,客......
  • dsp开发与arm开发有什么区别,应用差别
    一、DSP开发与ARM开发的区别DSP(DigitalSignalProcessor)和ARM(AdvancedRISCMachine)是两种不同类型的处理器,它们在设计理念、应用领域、指令集架构、性能特点等方面有所区别。设计理念和应用领域DSP:主要用于数字信号处理,如音频、视频、通信和图像处理等领域。它具有高性能......
  • Jmeter与loadrunner的区别
    当比较JMeter和LoadRunner时,我们可以从以下几个方面进行更详细的比较:1.**功能和支持的协议**:-JMeter主要支持HTTP、HTTPS、FTP、JMS、SOAP、LDAP等常见协议,适用于Web应用程序和Web服务的性能测试。-LoadRunner支持更多的协议和技术,包括HTTP、HTTPS、JDBC、LDAP、RDP、Ci......
  • TCP和UDP的区别
    TCP(传输控制协议)和UDP(用户数据报协议)的区别TCP(TransmissionControlProtocol):1.面向连接:在发送数据之前,TCP需要通过三次握手(SYN、SYN+ACK、ACK)来建立连接,以确保双方可收发数据。2.可靠性:TCP会确保数据在传输过程中的顺序性和完整性。如果数据包丢失或错误,TCP会自动请求重新......
  • 标签和关键词有什么区别
    关键词和标签都是用来描述和分类信息的,但它们之间存在一些区别:定义:关键词:通常是一些特定的词或短语,用来概括和突出文档、文章或网页的核心内容。它们是搜索引擎优化(SEO)中的重要元素,帮助用户和搜索引擎快速了解内容的主题。标签:是用于分类和组织信息的标签,可以是任何形式的词......
  • 在JavaScript中,函数前加`async`和不加`async`的区别
    在JavaScript中,函数前加async和不加async主要有以下区别:返回值类型:加async:使用async关键字声明的函数总是返回一个Promise对象。这意味着,无论函数中返回的是什么值,它都会被自动包装在一个Promise中。不加async:普通函数返回的是其执行结果,它不会自动包装在Promise中。如果需......
  • JS面试题:hash和history的区别
    一、hash模式和history模式的介绍由于Vue项目为单页面应用,所以整个项目在开发和构建过程中,仅存在一个HTML物理文件。通过路由系统可以实现将项目的组件与可访问的URL路径进行绑定。由于Vue项目只有一个HTML物理文件,切换页面时既需要让访问的URL路径发生变化,又不能触发H......
  • [转]一文详解标清高清超清之间的区别
    在当今数字化的世界中,高清视频已经成为人们观看娱乐内容的标配。标清、高清和超清,这些术语常常用来形容视频的质量和清晰度。但是,这些术语具体代表的含义是什么?它们之间有什么区别?接下来,我们将详细讲解它们之间的区别。我们先了解下区别。1、分辨率不同标清视频的分......