C/C++ 内存和堆栈

(一)内存分区

在C++中,内存分成5个去,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区

栈:就是那些由编译器在需要的时候分配的,在不需要的时候自动清除的变量的存储区。也就是说那些静态存储分配的局部变量都在这里。

堆:动态存储分配的,由new/malloc分配的内存块,它们的释放编译器不去管,而是由应用程序去控制,一般一个new/malloc就要对应一个delete/free。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

全局/静态存储区:全局变量和静态变量被分到同一块内存中。

常量存储区:这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改。如果非要修改在C++中也可以利用const进行修改。


(二)堆和栈的区别

分配方式不同:栈内存是由编译器负责分配和释放的。堆的释放工作是由程序员来控制的,容易忽略。

空间大小不同:栈,一般都是有一定的空间大小。堆内存几乎是不受限制的。

碎片的产生:堆,频繁的new/delete, malloc/free势必会造成内存空间的不连续,造成大量的碎片空间,程序效率降低。栈,不会存在这个问题,栈是先进后出的队列,所以永远不可能在内存块中间出现碎片。

分配方式不同:堆是动态分配的,没有静态分配的堆。栈有两种分配方式:静态和动态,静态分配时编译器自己完成的(局部变量)动态分配是由alloca函数进行分配。

分配效率不同:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持。堆是C++函数库提供的,机制比较复杂,所以栈的分配效率比堆的效率高, 由于堆是动态分配,在分配内存后,OS要负责将VA映射到物理内存, 效率没有静态分配的栈高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值