C语言与内存的关系

  • 格式:pdf
  • 大小:123.50 KB
  • 文档页数:3

C语⾔与内存的关系

⼀、C语⾔为什么需要内存

1.C语⾔的⽬的

计算机程序⽬的是程序的运⾏,运⾏的⽬的是为了得到⼀定的结果或者是在运⾏的过程中执⾏了某项动作。程序 = 代码(加⼯数据的动作) + 数据

函数可以完美的解释: 返回值是void ,说明没有输出结果,形参为void,说明没有输⼊数据。反之,套⽤即可。当然也有即输出结果和输⼊数据的,如 int add(int a,int b);

所以,这就回答了为什么C语⾔需要内存这个问题了:99.9的程序需要数据的参与,内存存储可变数据,数据在程序中表现为全局变量和局部变量(在gcc中,常量也存储在内存中,在单⽚机中,常量存储在flash中,也就是存在代码段中)。所以内存对于程序的有效⼒是本质相关的!所以说C语⾔程序需要内存。

2.冯诺依曼结构和哈佛结构

冯诺依曼结构:数据和代码放在⼀起;哈佛结构:数据和代码分开。按照我此刻的思想去理解,代码即函数,数据即局部变量+全局变量。

在JZ2440 中运⾏的Linux系统上,运⾏应⽤程序时,所有的应⽤程序代码和数据都在DRAM中,所以是冯诺依曼结构;在单⽚机(裸机)中,程序烧写在NorFlash上,然后将程序在Flash中原地运⾏,程序中涉及到的数据在RAM(SRAM)中运⾏,这就是哈佛结构。

3.动态内存DRAM和静态内存SRAM

4.内存的管理

现在的⽔平,还没到管理内存的地步,我们先不研究它。但是得知道,内存有内存管理机制,为⽤户提供了API接⼝,如C/C++中的malloc(),free(),new()等函数;java/C# 则直接回收内存,基本不⽤对内存进⾏操作了。

⼆、位、字节、半字、字的概念和内存位宽

1.概念解析

位=1bit,字节=8bit

内存位宽、半字和字得看处理器是多少位的,⽐如说处理器是32bit的,则内存位宽是32bit,字=32bit ,半字是字的⼀半,就是16bit 了。在MSP430上,由于它是16bit处理器,所以它的字是16bit的。80c51单⽚机是8位的,所以位宽是8位的

2.int应该是2位。4位的还是8位的呢?

在VC++平台上,int默认为long int类型,长度是4;在TC平台上,int默认为short int,长度为2.3.多少位有什么意义呢?

CPU按照其处理信息的字长可以分为:⼋位微处理器、⼗六位微处理器、三⼗⼆位微处理器以及六⼗四位微处理器等。CPU最⼤能查找多⼤范围的地址叫做寻址能⼒,CPU的寻址能⼒以字节为单位,如32位寻址的CPU可以寻址2的32次⽅⼤⼩的地址也就是4G,这也是为什么32位的CPU最⼤能搭配4G内存的原因,再多的话CPU

就找不到了。我们安装系统时所说的32bit系统和64位系统就是说的这些。64位的寻址能⼒更强,当然要求的硬件配置也更⾼!

三、内存编址和寻址、内存对齐内存是以字节为基础分配的。

内存编址:给每个字节填上⼀个编号,这个编号我们常说叫作地址。如 int a; //内存就会给变量a分配⼀块4个字节的内存,&a表⽰⾸字节的地址。内存的寻址:给出编号,可以找到对应的地址,且可以分配对应的内存空间。

如给某个绝对地址赋值为12 : *(unsigned int *)0x1000 = 12; //系统会分配0x1000、0x1001、0x1002、0x1003地址空间为int类型内存对齐:⽤结构体来说明。struct a{ char c; int b; long d; };

sizeof(a) = 12;

这就是内存对齐,内存对齐了才容易找,但是为了节省空间,可以不适⽤内存对齐的⽅式。不过这种⽅式现在很少使⽤了。

另外,int这种数据类型,由于其使⽤的效率⾼,⼗分对应硬件需求,甚⾄在使⽤bool(1bit)的请况下,分配了⼀个int内存给它(即使浪费了31bit),但是效率加快了许多。这就是增⼤了内存,提⾼了效率,换句话说,就是提⾼了流畅性和⽤户体验。这就是内存对齐的威⼒!

其实内存对齐还有⼀个重要的类型,就是数组(作为最简单的数据结构)。与结构体的区别:1.结构体数据容易增减;2.数组要求元素相同,分配的内存确定。3.寻址不⼀样,数组为a[1], 结构体需要定义结构体类型之后,定义结构体变量在⽤ a->b 或者 a.b

四、C语⾔如何操作内存

结合上⾯描述内存对齐的时候可以发现,C语⾔是通过数据类型去操作内存的。

那什么是数据类型呢?数据类型的本质含义是内存中所占的内存格⼦长度+解析⽅法。不同的数据类型有不同的解析⽅法如int a; //内存就会给变量a分配⼀块4个字节的内存,&a表⽰⾸字节的地址。 这个解析⽅法为int类型,分配4个字节,存储整型数据float b; //分配4个字节,存储浮点型数据(⽐如,前两个字节存整数部分,后两个字节存⼩数部分..) 这个解析⽅法为float类型,分配4个字节,存储浮点型数据double * c; //分配4个字节,存储指针变量。 这个解析⽅法为double指针类型,分配4个字节,存储指针变量,这个解析⽅法对应数据指向double类型的数据。

五、内存管理之栈和堆

1.栈

2.堆