c/c++ | 内存管理

92 篇文章 0 订阅
15 篇文章 0 订阅

说到内存管理,可以这样切入,项目经过编译生成程序,程序的文件类型为ELF 格式
那么ELF 是什么文件呢,全称叫可执行与可链接格式(Executable and Linkable Format)是一种可用于执行文件、目标代码、共享库和核心转储(core dump,这是经常出现程序崩溃的显示啊啊 其实就是当程序崩溃,会把核心数据转存的一种技术或者策略)

在这里插入图片描述
ELF 文件,包括两大类,一个是ELF头,一个是后面紧随的文件数据部分
ELF 文件也是通过分区 进行存储的
然后,数据部分依次是,只读部分、读写部分、配置信息(就是不需要映射到内存空间的符号表和调试信息)

简单讲几个部分
.txt 代码段,通常存放经编译的机器码
.road 只读数据段,该段的数据不能被修改,存放的是程序会使用的常量
.data 数据段,该段存放已经初始化的全局变量、常量
.bss bss段,该段存放未初始化的全局变量,仅仅是占位符,不占用任何实际磁盘空间。采用这用方式区分初始化和未初始化本质就是为了提高文件存储的空间效率。

操作系统在加载 ELF 文件时会将按照标准依次读取每个段中的内容,并将其加载到内存中,同时为该进程分配栈空间,并将 pc 寄存器指向代码段的起始位置,然后启动进程。

所以在启动程序的时候,.ini 块,会被程序寄存器(pc)指向,作为代码段的起始位置,然后启动进程。

好了,程序启动,程序的数据会被陆陆续续调进内存中,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这里在捎带讲一下进程。
进程,是计算机分配资源的最小单位,它是一个过程,启动程序,程序按照指定数据集跑,程序动态执行的过程。是不是讲的很罗里吧嗦?非常罗里吧嗦!!!进程是正在运行程序的实例,其包括程序计数器、寄存器、程序变量的当前值,它就是一个程序执行的流程,然后这个流程内存保存程序运行所需的资源。

接着,程序跑起来了,
再来讲讲内存分区
c++程序根据运行执行的不同功能划分了不同的段,主要有栈、堆、全局/静态存储区、常量存储区、代码区
这些都是能和ELF 存储分区能够对上的

栈,总要存放函数的局部变量、函数参数、返回地址等。通常由操作系统默认分配或者程序指定分配,栈空间的生存周期,伴随进程,一始而终。
堆,这个就是动态申请的控件了。在c 就是malloc/free、c++ 就是new/delete 对了,new/delete 本质其实也是malloc/free 封装而来。这部分的内存分配使用程序控制的,当然本质也是程序员来做这部分曹总,当忘记销毁,程序结束的时候,由系统自动回收。
全局区/静态区 主要是.bss 端和 .date段,存放全局变量以及静态变量
常量存储区 .roadata 存放的是常量,不允许修改,运行结束会自动释放。
代码区 .text 段 存放代码,不允许修改,可以执行,编译后以二进制格式存放。

#############################################################
更新
空类创建的对象、静态成员都是不占用内存或者整体只需要一个1B
在这里插入图片描述
详细参考这位大佬----这个大佬太牛了
点这里

这里讲一下 为什么是12B 而不是9B
干脆直接看画的图
在这里插入图片描述

再贴一张 各个基本数据类型的大小
在这里插入图片描述

也就是说,double 100% 是8B,而long double 还没有一个标准,现在给的是8B
注意B == byte
常说的b 是位, 这么说比如8B 表示有8个空,每个空填0/1然后也是按照二进制转十进制,看看能表示多少十进制
如果没换明白,就以十进制为例,有三个空,每个空可以填 0~9,那么这三个空最大表示为999
注意了,二进制表示的负数,其实是在最高位,来表示,在这个高位上0表示整数,1表示负数

在这里插入图片描述

还是这个大佬文章
继续点这里

在这里插入图片描述

再来个静态全局、静态局部变量的讨论
再再看这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值