C语言内存分配实现原理

内存分配问题(C语言\C++)

C语言

  1. 栈(编译器自动分配释放)
  2. 堆(程序员分配释放、程序员不释放则程序结束使可能由OS回收,例如malloc,calloc,realloc
  3. 全局、静态区(全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和未初始化的静态变量放在相邻的另一块区域,在函数体外定义的static变量表示在该文件中有效,不能extern到别的文件,函数体内则只在该函数体内有效)
  4. 存放常量(程序结束释放)

C++

  1. 堆(new分配的内存块,如果未delete则程序结束后操作系统会自动回收)
  2. 自由存储区(malloc分配,free结束)
  3. 全局/静态存储区(不区分全局变量是否初始化)
  4. 常量存储区(存放常量,且正常手段下不允许修改)

浅谈堆栈

  1. 系统通过专门机器完成栈操作,高效不灵活,支持的数据有限(整型指针浮点数(系统直接支持的数据类型)【系统数据结构,对于进程/线程是唯一的,静态分配(auto)由编译器完成,动态分配由alloc完成,动态分配无效释放,可移植性上考虑,栈的动态分配不被鼓励】
    1. 程序调用(call指令隐含返回地址入栈,ret子程序弹出返回地址并跳转)
    2. 自动变量
  2. 堆不被系统支持,由函数库提供,内存被释放时会进行合并等处理【函数库内部数据结构,不唯一,不同堆分配的内存无法互相操作,堆空间的分配是动态的。】

对象的内存分配

  1. 局部变量:局部变量分配在栈上
  2. 全局变量: Person person;自动分配到全局数据段
  3. 显示地调用malloc则可以通过堆分配

new方法解析(例:p = new Person)基于堆

  1. 为对象分配内存
  2. 对象比结构复杂的地方,初始化工作,调用构造函数完成初始化

 

 

delete方法解析(例:p = new Person)基于堆

  1. 先做清除工作,调用destructor析构函数
  2. 释放内存(free)

 

基于栈的对象构造

  1. C++支持,比基于堆的构造函数快
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值