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类型
- 内存对齐:用结构体来说明。
1
2
3
4
5
6
|
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语言是通过数据类型去操作内存的。
那什么是数据类型呢?数据类型的本质含义是内存中所占的内存格子长度+解析方法。不同的数据类型有不同的解析方法如
1
|
int a; //内存就会给变量a分配一块4个字节的内存,&a表示首字节的地址。 |
这个解析方法为int类型,分配4个字节,存储整型数据
1
|
float b; //分配4个字节,存储浮点型数据(比如,前两个字节存整数部分,后两个字节存小数部分..) |
这个解析方法为float类型,分配4个字节,存储浮点型数据
1
|
double * c; //分配4个字节,存储指针变量。 |
这个解析方法为double指针类型,分配4个字节,存储指针变量,这个解析方法对应数据指向double类型的数据。
五、内存管理之栈和堆
1.栈
栈的功能实现代码:http://www.cnblogs.com/simonLiang/p/6113705.html
2.堆
转自:https://www.cnblogs.com/simonLiang/p/6113598.html