首页
题库
面试
求职
学习
竞赛
More+
所有博客
搜索面经/职位/试题/公司
搜索
我要招人
去企业版
登录 / 注册
首页
>
试题广场
>
简述一下堆和栈的区别
[问答题]
简述一下堆和栈的区别
添加笔记
求解答(0)
邀请回答
收藏(129)
分享
纠错
16个回答
添加回答
20
琴酒的小迷弟
管理方式:栈由编译器自动管理,堆由程序员手动开辟释放;空间大小:栈空间有限,堆几乎没有限制,栈小于堆;碎片:栈不存在碎片问题,频繁分配释放堆会造成内存碎片;生长方向:栈沿着内存地址减小的方向生长,堆沿着内存地址增大的方向生长;分配方式:栈有静态分配和动态分配,静态由编译器分配,动态由malloc函数分配且由编译器释放,堆只有动态分配;分配效率:栈是机器系统提供的数据结构,效率很高,堆是 C/C++ 函数提供的,机制复杂效率低。
发表于 2022-08-02 19:34:58
回复(1)
3
wit_1805121326
1. 申请的方式不同。栈由系统自动分配,堆是人为申请开辟的; 2. 申请的大小不同。栈获得的空间较小,堆获得的空间较大; 3. 申请的效率不同。栈由系统自动分配,速度较快,堆一般速度较慢; 4. 存储的空间不同。栈是连续的空间,堆是不连续的空间; 5. 存储的内容不同。栈中存放的是基本数据类型和堆中对象的引用,堆中存放的是对象。 栈由系统自动分配释放,存放函数的参数值、局部变量、返回地址等。堆存放动态分配的数据,一般由程序动态分配和释放,若程序不释放,程序结束时可能由操作系统回收。
发表于 2023-03-02 09:51:38
回复(0)
2
别说天会黑
堆是由程序员自己开辟和释放的,栈是由操作系统自己管理
发表于 2022-06-27 08:56:59
回复(0)
0
水煮大鸡蛋
栈是线性结构,堆是非线性结构
编辑于 2024-04-24 22:32:45
回复(0)
0
代码要笑着写
堆从低地址向高地址生成,使用new或malloc申请堆空间,由程序员管理;栈从高地址向低地址生长,用于函数调用(调用者将函数参数压栈,然后调用call汇编指令,这个指令将下一个指令的地址压入栈中并更改eip的值为函数地址,随后被调用者先保存原函数栈帧,生成自己的栈帧,取出参数)、局部变量管理等
编辑于 2024-03-28 11:12:35
回复(0)
0
牛客393524079号
栈内存是由编译器自动管理的,无需手动控制,但是栈的空间较小。堆是由程序员手动开辟的,通过使用new和delete/malloc和free做分配和回收,堆不宜频繁操作,容易造成大量的内存碎片,导致程序使用率降低。栈就不会存在这个问题
发表于 2023-11-11 13:07:11
回复(0)
0
雏鹰划空
1. 栈:有编译器自动管理,空间小,不存在碎片问题,沿着内存地址减小的反向生长,分配效率高(没有复杂的算法),动态分配(allocate函数)和静态分配(局部变量和函数) 2. 堆:有程序员手动管理,空间较大,频繁的分配释放会造成内部碎片的问题,沿着内存地址增加的方向生长,分配效率低下(需要复杂的内存分配算法支持),只有动态分配(new、delete)
发表于 2023-11-09 21:43:20
回复(0)
0
keepgoing_
栈内存的分配和释放是由操作系统完成的,而堆内存的分配和释放是由程序员完成的; 栈一般用于存放局部变量、函数调用的上下文,栈的容量很有限,大概为10M左右;堆一般用动态内存分配,堆的容量要比栈大得多,可以有几个G; 栈内不会产生内存碎片;而堆可能会造成内存碎片; 栈内存的地址是从高道低的,而堆内存是从低到高的;
发表于 2023-10-24 12:05:19
回复(0)
0
一个达布刘
1、堆:空间小,栈:空间大。2、堆:人为分配释放,栈:自动分配释放。3、堆:向上增长,栈:向下增长。4、堆:动态分配,栈:动态分配,静态分配。
发表于 2023-10-23 10:35:28
回复(0)
0
hcodeboy
堆:由程序员手动开辟和释放,内存从低地址向高地址增长,不连续,会有内存碎片 栈:存放局部变量,由系统自动释放,从高地址向低地址增长,连续,不存在内存碎片
发表于 2023-08-15 11:13:43
回复(0)
0
牛客443528257号
堆内存分配方式是从下至上拓展,需要使用malloc或new申请内存,使用完毕后需要程序员手动释放内存,会用到free或delete,堆内存容易产生内存碎片,并且分配的内存不一定是连续的。 栈内存自上往下拓展,无需手动申请和释放,每段内存有自己的名字,连续分配内存
发表于 2023-08-08 09:37:53
回复(0)
0
梦凡不想平凡
动态分配:在运行时分配空间(new的数据)
发表于 2023-04-02 21:12:42
回复(0)
0
真令人头秃
堆的容量大于栈,堆的管理方式需要程序员手动释放,堆的生长方向是从下往上,堆由于多次申请内存和释放内存容易出现内存碎片,堆只有动态分配的方式,堆的效率没有专门的指令因此低于栈,
发表于 2023-02-09 19:30:48
回复(0)
0
牛客665425410号
栈是由编译器自动分配和释放 而堆是由程序员手动释放和分配
发表于 2022-10-31 19:56:05
回复(0)
0
牛客184069894号
空间大小: 栈空间和堆空间大小限制,栈空间大小有限制,windows默认系统设置是2M,Linux默认8M,理论上,程序员可申请的堆大小为虚拟内存的大小。
发表于 2022-09-03 21:13:35
回复(0)
0
牛客965539880号
管理方式:栈是由编译器管理的 堆是由程序员管理的,分配和释放都有程序员完成。空间大小,栈一般具有固定的大小,堆没有固定的大小,由于频繁的分配和会造成内存的不连续产生内存碎片。生长方向栈是向着低内存的方向生长,因此数据是先进后出的。分配方式 栈有静态分配和动态分配两种(alloca)栈的分配效率高与堆的
发表于 2022-08-29 21:45:57
回复(0)
这道题你会答吗?花几分钟告诉大家答案吧!
提交观点
问题信息
操作系统
上传者:
real19931
难度:
16条回答
129收藏
2376浏览
热门推荐
相关试题
有两个N*N的矩阵A和B,想要在P...
阿里巴巴
操作系统
评论
(38)
来自
阿里巴巴2015实习生笔试题
请编写实现malloc()内存分配...
微软
C++
操作系统
评论
(3)
分页系统的逻辑地址结构是一维的,分...
操作系统
评论
(1)
关于分段系统与分页系统的区别,描述...
操作系统
评论
(1)
你说在销售运营这个岗位上会涉及到一...
评论
(1)
扫描二维码,关注牛客网
意见反馈
下载牛客APP,随时随地刷题