C++:内存管理:C++内存管理详解(二):带你攻破内存管理

前言:

  • 任何程序运行起来都需要分配内存空间存放该进程的资源信息,C程序也不例外。
  • C程序中的变量、常量、函数、代码等等信息所存放的区域都有所不同,不同的区域又有不同的特性。

欺骗C进程

每一个C语言的程序被执行起来的时候系统为了方便开发人员操作,会给每个进程分配一个虚拟的内存空间,它实际上是从物理内存映射出来的。虚拟内存的启始地址和结束地址都是固定的,因为虚拟内存的布局都是一样的。比如:有三个进程P1 P2 P3,他们虽然得到的物理内存是完全不一样的,但是从进程的角度来看他们三个得到的内存确是一样的。

     

 假设你正在使用的计算机实际物理内存只有1GB大小,而当前系统运行了三个进程,Linux会将PM中的某些内存映射为三个大小均为4GB的虚拟内存,让每个进程都以为自己独自拥有完整的内存空间,这样极大的方便了应用程序的数据和代码组织。

 同时一个用户进程可以访问的内存区域介于:0x0804~0xc000000之间,这个广阔的区域又被分成几个部分,分别用来存放进程的代码和数据。

栈内存

栈内存用来存放环境变量、命令行参数和局部变量。栈空间十分有限,默认情况下栈的大小为8M,在嵌入式开发的时候我们应该尽可能的减少栈空间,栈空间的增长,从上(高地址)往下(低地址),每当有一个函数被调用的时候,栈就会从上往下分配一个段,这一段空间就是栈帧,该内存空间用来存放该函数的局部变量。

  •  每当一个函数退出(调用结束)的时候,栈空间会从下往上释放一个栈帧,将所有的内存归还给系统。
  • 栈空间中的内存存放的数据是未知的,因此每一个局部变量在使用之前最好初始化
  • 栈内存空间我们无法手动实现申请与释放,都是由系统自动完成,我们无法干预。

堆空间

堆空间是相对自由的空间,这是一个非常重要的区域,因为在此区域定义的内存的 生命周期我们可以控制: 从molloc()/calloc()/realloc() 开始,到free()结束,其分配和释放完全由我们开发者自定义,这就给了我们最大的自由和灵活性,让程序在运行过程中,以最大的效益使用内存。

Action:

  1.      相对于栈空间来说,堆空间的内存空间相对大很多
  2.      堆空间的增长方式,从下(低地址)往上(高地址)
  3.      堆空间中的内存都属于匿名空间,因此需要借助指针来访问
  4.      开发者自行申请和释放,如果没有释放那么没有释放这个空间将一直存在,直到程序结束。 

数据段

数据段中存放着全局变量、静态变量和常量这些数据,生命周期与程序一致,程序不止,数据不断

代码段

代码段中又分程两个空间:

.text段:存放用户的代码(main  func)

init段:当程序运行之初的一些初始化的工作(由编译器根据系统来对应添加)

 

 总结:

内存管理是嵌入式学习的重点知识,也是判断一个人是否入门的重要标志,内存管理学的好,对C语言的学习理解有着深刻作用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值