中科因仑“3+1”工程特种兵精英论坛

标题: 浅谈C语言中关于内存的理解 [打印本页]

作者: 彭红福    时间: 2018-3-31 02:08
标题: 浅谈C语言中关于内存的理解
本帖最后由 彭红福 于 2018-3-31 02:09 编辑

我们在编程中最常接触的就是内存了,不管是定义变量还是说定义函数,不管是什么语言,脱离内存的编程显然是没有意义的,初学编程的时候显然我们可能不太注意内存的一些问题,特别是高级语言越是将内存相关的内容简化了,但是这并不意味着内存不重要,当然我们在这里并不是想要告诉大家怎么去管理内存,只是简单的对内存进行说明和概念的介绍。
1、冯诺依曼结构
程序和数据是放在一起的,在系统启动后,程序和数据都加载到DRAM当中运行,数据和程序是交织在一起的,是可以被改变的,像inter的桌面级CPU基本都是冯诺依曼结构的。
2、哈佛结构
    主要是用在单片机里面的,程序写好后里面有函数和变量,这些数据在烧写程序的时候都先存在Flash当中(NorFlash-Flash一经写好就不可以再改变了)单片机的内核直接从Flash当中读取运行程序,但是一些变量是加载在SRAM里面运行的(常量是还是存在Flash里面的),在GCC里面常量也是加载在内存里面的,像单片机,嵌入式的CPU都是哈佛结构的,ARM的CPU在运行的时候其实程序和数据也是全部加载在内存里面的,只不过嵌入式的操作系统将内存分成了程序存储区域和数据区域,系统限制存储程序的区域是不可访问的。
3、内存管理
    操作内存就是对内存的管理,一般操作系统管理内存把内存分成内存页面(一般是4KB的字节)来管理,比页面小的还有更加精细的管理方式,在申请内存以后一定要释放内存,不然会造成内存的泄露(程序无法访问的内存)。
4、内存位宽
    内存的宽度有8位的也有16位对齐的(即寻址线的宽度),通过并联可以将2个16位的内存并联成为32位的内存。内存大小的单位:位(1bit)字节(8bit)半字(一般是16bit)字(一般是32bit),半字和字一般根据平台来定义的。
5、内存的大小
    内存的编址是以字节为单位的为8个bit。一般定义的int的类型的变量就是以字为单位的如果是32位的平台int类型就是32位的,16位的平台就是16位,8位的平台一般int也是16位的。
6、数据类型和内存的关系
    在32位的系统中最好就是用int来定义变量效率是最高的,因为32位的操作系统一次性取地址是32位的正好是一个字,定义的8位和16位数据访问效率就没有32位的高,在很多的32位环境下定义一个bool变量(一个bit)编译器一般都是取的32位数据(实际上浪费了31位)。
7、内存对齐
    比如int变量是4个字节,在内存分配是可以对齐也可以不用对齐,对齐就是内存一般是一个32位的地址对应一个4字节的空间,每个空间八位这样排列的,这样刚好占用这4个字节就是对齐了,如果是占用的连续的位空间但是占用了两个4字节对齐的空间,那么这4个字节就是非对齐的。
8、C语言对内存的封装
    C语言申请内存就是对定义一个数据类型,如int a 就是申请了一个长度为32位的整形的变量,编译器就将a和申请的地址绑定起来,这个地址的长度是32位的,假如申请的a的首地址是0x30000000,那么a占有的内存空间就是:
0x30000000+0x30000001+0x30000002+0x30000003。
    不同的数据类型申请的地址长度不一样,解析方法也不一样,同一个地址里面,int和float都是占有4个字节的空间,但是解析出来的数据是不一样的。如int a:编译器分配4字节长度给a,并把占用的第一个字节的地址和符号a帮定起来。Int b[10]:编译器分配40个字节长度给b,并把首元素第一个字节的地址和符号b绑定起来。
    C语言中函数名也是一段代码的首地址。
    这里我对内存的说明可能还不太全面,大家也可以自己在网上收集一些资料,其实上面的内容也是我在网上看的资料,只是我再做了一个简单的总结,所以可能还有很多的不足,也欢迎大家更贴回复反馈。






欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) Powered by Discuz! X3.4