C语言(计算机专业应该知道的内存知识) 1.程序运行需要内存 (1)计算机程序 = 代码 + 数据,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。 (2)什么是内存: 内存实际上是一堆存储颗粒的集合, 每一个最小的内存单位可以储存0和1的数字状态, 内存是用来存储可变数据的. (3)内存的基本单位: 内存单的大小单位有4个:位(1bit) 字节(8bit) 半字(一般是16bit) 字(一般是32bit),在所有的计算机、所有的机器中(不管是32位系统还是16位系统还是以后的64位系统),位永远都是1bit,字节永远都是8bit. 2.内存编址和寻址、内存对齐 (1)内存编址方法: 内存在逻辑上就是一个一个的格子, 每个格子有一个编号,这个编号就是内存地址, 这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。 (2)内存编址是以字节为单位的:这个大小是固定式,就是一个字节(8bit). (3)内存和数据类型的关系: C语言中的基本数据类型有: int 整形(整数类型,这个整就体现在它和CPU本身的数据位宽是一样的)譬如32位的CPU,整形就是32位,int就是32位;64位的CPU,int就是64位. (4)内存对齐: 对齐访问很配合硬件,所以效率很高;非对齐访问因为和硬件本身不搭配,所以效率不高. 运行结果为: 8 12 3.C语言对内存的访问与解析 (1)C语言对内存地址的封装(用变量名来访问内存、数据类型的含义) int a; // 编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的, 也不需要知道。),并且把符号a和这个格子绑定。 a = 5; // 编译器发现我们要给a赋值,就会把5丢到符号a绑定的那个内存格子中。 a += 4; // 编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先把a原来的值读出来,然后给这个值加4,再把加之后的和写入a里面去。 (2)C语言中数据类型的本质含义是:表示一个内存格子的长度 数据类型决定长度的含义:我们一个内存地址(比如0x),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x)就能表示从这个数字(0x)开头的连续的n(4)个字节的内存格子了(0x + 0x + 0x + 0x)。 (3)用指针来间接访问内存: C语言中的指针,全名叫指针变量,指针变量其实很普通变量没有任何区别。譬如int a和int *p其实没有任何区别,a和p都代表一个内存地址(譬如是0x),但是这个内存地址(0x)的长度和解析方法不同。 a是int型所以a的长度是4字节,解析方法是按照int的规定来的;p是int *类型,所以长度是4字节,解析方法是int *的规定来的(0x开头的连续4字节中存储了1个地址,这个地址所代表的内存单中存放的是一个int类型的数)。 总之,指针就是一个存储地址的一个普通变量。 4.两种结构:冯诺依曼结构和哈佛结构 冯诺依曼结构是:数据和代码放在一起。(代码就是多个函数体,数据就是全局变量、局部变量)哈佛结构是:数据和代码分开存在。 比如在S5PV210中运行的linux系统上,运行应用程序时:这时候所有的应用程序的代码和数据都在DRAM(动态内存),所以这种结构就是冯诺依曼结构; 在单片机中,我们把程序代码烧写到Flash(NorFlash)中,然后程序在Flash中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在Flash中,必须放在RAM(SRAM静态内存)中。 这种就叫哈佛结构。 5.动态内存和静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间,都无须程序员自行考虑。比如定义数组… 动态内存是程序员自己确定使用内存空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配,常用malloc申请,用完用free释放。 区别: a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。 b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。 c) 动态内存分配需要指针和引用类型支持,静态不需要。 d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/52519.html