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++支持,比基于堆的构造函数快

你可能感兴趣的:(C/C++,C/C++,基础,内存分配,堆栈)