1 内存
【原创】转载,引用,请注明出处,感谢~
1.1 内存简介
- 物理上:内存就是我们计算机中的内存条,如下图所示,一个内存条就是一块印制电路板,由多个存储器芯片(DDR SDRAM)组成,其中,存储器芯片就是下图中的黑色块块,也可称其为颗粒,内存的特点是读写速度快,但断电后所存储的数据会丢失。
- 内存与硬盘区别:硬盘,特点是断电后数据不丢失,容量大,但读取速度慢。我们安装的软件,写的文本文件都是保存在硬盘中的(否则断电后,东西就都没了),当我们打开一个软件或者打开一个文本文件后,操作系统会为这个软件或文件分配内存空间,再从硬盘中将其拷贝到内存中,这样我们的CPU就可以高速的操作软件或者读写文件了(否则没有内存当这个桥梁的话,软件运行速度会很感人~)。例如:我们打开了一个word文档,操作系统会为这个文档分配内存空间,将硬盘中的word文档拷贝到内存中一份,我们编辑word文档其实是在编辑内存中的副本,当我们点击保存按钮时,会将内存中的副本写到硬盘中去,这样当我们关闭电脑再次打开时,修改后的文件依然有效。
- CPU:我快如闪电
- 内存:我虽然没有CPU块,但是我可比硬盘快多了
- 硬盘:虽然我很慢,但是我容量大,又便宜
- 程序中的内存:在我们编写C程序时,内存的概念跟我们打开一个文件没有什么差别。例如:当我们定义一个变量时,C编译器会请求操作系统为这个变量分配内存空间,当不需要这个变量时,C编译器会请求操作系统释放这个变量的内存空间。
- 一句话:C程序员需要清楚的知道一个变量的生命周期,也就是一个变量什么时候有了内存空间,什么时候被释放了。**
1.2 内存模型
- 为了清楚的知道程序中众多变量的生命周期,我们需要对计算机中的内存空间进行建模,称为内存模型。当然了,模型不一定要非常的精确,只要有一个相对简单的模型便于我们分析就可以了。
- 在本篇笔记中会基于以下内存模型进行分析:
- 栈区:局部变量的所保存的位置,特点:系统自动申请内存空间,自动释放内存空间
- 堆区:程序员通过使用malloc(), calloc(), realloc()等函数手动分配的内存空间所保存的位置,特点:手动分配内存空间,手动释放内存空间
- 全局区:全局变量和全局字符串所保存的位置,特点:系统自动分配内存空间,在整个程序运行期间不释放这段内存空间
- 代码区:程序中文本所保存的位置
- 内存的计量单位:跟计算机中其它存储设备一致,即:
1TB = 1024GB, 1GB = 1024MB,1MB = 1024KB,1KB = 1024Byte,1Byte = 8Bit
由于ASCII码中一个字符使用1个字节表示,因此,程序中一般用到的内存最小计量单位是字节(Byte)。 - 内存模型的具体表现形式:以上四种内存模型的具体表现形式都可理解为如下图所示的“储物格”,每个储物格都有唯一的“标签”(内存地址)与之对应,当我们访问一个”格子“的数据时,必须根据“标签”找到”格子“的空间,将数据”放入“(写)或”拿出“(读)。
- 一句话:在大脑中建立上图内存模型,在我们编写程序时对号入座即可。**