C++ 栈和堆

C++中,内存分为以下5个区:
  • Stack(栈):
    由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数值、返回变量等。

  • Heap(堆):
    容量大于栈,程序中动态分配的内存,由程序员申请和释放。如果程序员没有释放掉,资源将由操作系统在程序结束后自动回收。

  • BSS(Block started by symbol):
    存放未初始化的全局和静态变量。(默认设为0)

  • Data Segment (数据区):
    存放已初始化的全局和静态变量, 常量数据(如字符串常量)。

  • Code Segment(代码区):
    也称Text Segment,存放可执行程序的机器码。

堆和栈的区别

1、申请和管理方式
栈:系统自动分配;由编译器进行管理,在需要的时候分配空间,在不需要的时候自动回收空间;一般用于存放函数参数和局部变量;
堆:程序员自己申请释放;如果不回收释放,则会存在内存泄漏的问题;

2、内存生长方向
栈:栈是向低地址扩展的数据结构(向下),是一块连续的内存的区域;
堆:堆是向高地址扩展的数据结构(向上),是不连续的内存区域(不连续是由于系统是用链表来存储的空闲内存地址的);

3、申请大小
栈:在Windows下,栈的大小是一个编译时就确定的常数,空间比较小,一般是2M;如果申请的空间超过栈的剩余空间时,将提示overflow;
堆:堆的大小受限于计算机系统中有效的虚拟内存;堆获得的空间比较灵活,也比较大;

4、申请效率
栈:栈由系统自动分配,速度较快。
堆:堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,但用起来最方便;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值