堆和栈的区别


一个由C/C++编译的程序在内存分配时包括以下几个部分:
1.栈。存放局部变量等
2.堆。存放程序员申请的内存,在程序结束时可能会由操作系统回收
3.静态区:存放静态变量和全局变量的区域
4.常量区:存放常量字符串
5.代码区:存放二进制代码的区域

栈是操作系统在建立某个进程或者线程时为其建立的存储区域,是存放局部变量的区域,由操作系统分配内存空间,因此当程序结束时,变量会自动回收,因此不用手动销毁变量从而释放内存空间
栈的内存地址生长方向与堆相反,由高到底,所以后定义的变量地址低于先定义的变量

堆是程序运行时申请的某个大小的内存空间,是存放申请内存的区域,由程序员分配内存空间,程序运行结束,不会自动销毁内存空间,因此要手动清理,否则,会造成内存泄露

内存溢出和内存泄露:
内存泄露(memory leak):内存没有被及时的释放,导致内存不够
内存溢出(out of memory):申请的内存超过系统能够分配的内存

堆的内存地址生长方向与栈相反,由低到高,但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。

在java中,所有的对象都在堆中分配内存,在栈中分配该对象的引用。
alloc是向栈申请内存空间的,使用完之后无需手动释放
堆中存储的数据若未释放,则其生命周期等同于程序的生命周期。

堆栈的区别

管理方式不同

栈由操作系统自动分配释放,无需我们手动控制;堆的申请和释放工作由程序员控制,容易产生内存泄漏

空间大小不同

每个进程拥有的栈的大小要远远小于堆的大小
生长方向不同。堆的生长方向向上,内存地址由低到高,是一块不连续的区域;栈的生长方向向下,内存地址由高到低,是一块连续的区域

分配方式不同

堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现。

分配效率不同

栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值