C++内存管理机制

1.栈区
程序运行时分配内存。
c++程序运行时分配内存,主要存储函数的参数以及局部变量。
局部变量分配内存时在栈区从高地址到低地址查找空的内存区域进行分配。
局部变量定义在函数内部,当函数调用时分配内存,在函数结束时消亡,内存将自动被释放。
2.堆区
程序运行时分配内存
堆区又称动态内存分配区,主要存储new或者malloc出来的内存,分配内存时在内存的堆区中从低地址到高地址寻找空的内存区域进行分配。
delete或者free后回收内存,如果没有delete或者free操作则在程序运行结束后由操作系统回收内存。
3.全局区
程序编译时分配内存
全局区又称静态区,主要存储程序中的全局变量和一些static的静态变量。全局变量分配内存时在全局区从低地址到高地址查找空闲的内存区域进行分配。
4.常量区
存储字符串常量、整形常量等一些列常量的区域。
5.代码区
存放程序执行的cpu指令。

堆与栈的区别:
管理方式:编译器自动管理(栈) | 程序员手动管理(堆)
空间大小:有限制(栈) | 一般无限制(堆)
生长方向:向着内存地址减小的方向增长(栈) | 向着内存地址增加的方向增长(堆)
分配方式:局部变量由编译器静态分配,动态分配由allocal函数进行,编译器释放(栈) | 动态分配(堆)
效率: 高,机器系统提供数据结构,计算机在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈 出栈有专门的指令执行(栈)。| 低,由C/C++函数库提供,机制复杂,分配一块内存,函数库按照一定的算法在堆内存中搜索可用的足够大小的空间。
碎片问题: 先进后出,不产生碎片(栈) | 频繁new/delete 势必造成内存空间的不连续,产生大量碎片(堆)

存储方式:
1.自动存储
在函数内部定义的常规变量以及函数的参数使用自动存储空间,随着函数的调用分配空间,随着函数的结束释放内存空间。
2.静态存储
静态存储是整个程序执行期间都存在的存储方式。全局变量以及使用了static关键字的变量采用静态存储。
3.动态存储
hint
正在运行的C程序 = 代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈
编译时确定分配多少代码段+初始化数据段+未初始化数据段+栈。
数据段 – data
data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。数据段属于静态内存分配。
bss段–bss
bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。
C++内存回收:
回收所解决的只有2 个重要问题:第一,如何识别当前内存中未被引用的内存;第二,如何将失去管理的内存进行回收。
1.引用计数法:引用计数的原理非常简单:对于一个内存块,除内存块外本身增加一个引用计数,每当这个内存块被外部的指针或内存块所引用的时候,引用计数加1;当引用它的指针释放了对它的引用的时候,则引用技术减1,同时检查引用计数的值,当引用计数为0时,就销毁该内存块并释放其所占用的内存。它的优点就是垃圾回收过程无需打断进程运行,简单快捷,对资源管理很有效。
2 标记清除法:该算法分成2个阶段:标记阶段和清除阶段。在标记阶段,垃圾回收器扫描每个内存块,对被引用的内存块进行标记。在标记完成后,统一检测内存集中所有内存,将未被标记的内存块进行回收。
3. 可达性分析算法通过一系列的根对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到根对象没有任何引用链相连时,则证明此对象是不可用的,可以回收释放该对象。可达性分析优点是可以解决引用计数器所不能解决的循环引用问题。缺点是,运行算法时必须暂停运行工作线程的运行,运行效率较低。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值