计算机程序中的堆和栈的区别,C++中的内存分配以及堆和栈区别

c++中内存分为5个区,分别是栈、堆、自由存储区、全局/静态存储区、常量存储区

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

堆:由new分配的内存块,他们的释放编译器不用管,由程序控制,一般一个new对应一个delete,如果程序员没有释放,那么在程序结束后,操作系统会自动回收。

自由存储区:由malloc等分配的内存块,和堆相似,不过它是由free来结束生命。

全局/静态存储区:全局静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分初始化与未初始化的,他们共占同一块内存区。

常量存储区:存放的是常量,不允许修改。

栈与堆的区别:

管理方式:栈由编译器自动管理,无需手工控制,对于堆来说,释放工作由程序员控制,容易产生memory leak

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了站的效率比较高。堆是C/C++函数库提供的,他的机制是复杂的,例如没有足够大小的空间,就可能调动系统功能区增加程序数据段的内存空间,堆的效率比栈低很多。

空间大小:在32位系统下,堆内存可以达到4G空间,栈的默认空间是1M

生长方式:堆的生长方向是向上的,向着内存地址增加的方向;栈生长方向是向下的向着内存地址减小的方向。

能否产生碎片:堆频繁的new/delete会造成内存空间的不连续,从而造成大量碎片,而栈都是成对操作,不会有碎片。

分配方式:堆都是动态分配的,栈有静态分配,是由编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,其释放是由编译器进行

生长方向:堆的生长方向是向上的,向着内存地址增加的方向,栈的生长方向是向下的,向着内存地址见效的方向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值