内存是什么?或者先说内存有什么作用?
- 用于暂时存放CPU中的运算数据
- 以及存放与硬盘等外部存储器交换的数据
先清楚的是:CPU是用来处理、控制信息的,内存是用来存储信息的。
也就可以理解CPU在处理数据时,我们需要一个空间放这些数据,此时就是它啦。而内存里面具体也是有所划分的:
由低地址向高地址依依说明:
- 代码区: 指用来存放程序执行代码的一块内存区域。
- 数据区:指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。
- **BSS区: **指用来存放程序中未初始化的全局变量和静态变量 的一块内存区域。
- **堆区: **指用于存放进程运行中被动态分配的内存段,是需要由程序员主动控制的,谁创建,谁释放。
- 栈区: 指用户存放程序临时创建的局部变量的地方,此处是自动分配的,编译器需要的时候分配,不需要的时候自动释放和清除变量的内存区域。
重点来说: 栈、堆,可以从其区别来进一步理解
首先我们要区别一下,堆栈是分为数据结构中的堆和栈和内存分配中的堆和栈,先简单对比下,数据结构中的堆和栈:
- 堆: 它是指经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
- 栈: 它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。
但实际上,我们此处要说的是内存分配中的堆和栈:
1、申请方式和回收方式不同
栈:系统自动分配空间的,同时也是自动回收的。
堆:是我们自己根据需要自己申请的空间,回收当然是要看我们程序员什么时候释放,不释放就一直存在的。2、效率的不同
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由我们自己分配的内存,一般速度比较慢,而且容易产生内存碎片不过用起来最方便。3、大小的不同
栈:它是向低地址扩展的数据结构,是一块连续的内存的区域。它的最大容量是系统预先规定好的,所以栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。它的大小是受限于计算机系统中有效的虚拟内存,所以堆获得的空间相对比较灵活,也比较大。
另外就是像上面大致涉及到低地址和高地址,那所谓地址的偏移又是什么情况呢?
偏移地址:偏移地址就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。以上是百度百科的解释。
另外了解下:存储器中每一个单元的地址可以用两种方法表示:
1、逻辑地址:其表达形式为“段地址:段内偏移地址”。
逻辑地址是内部和编程使用的、并不唯一。2、物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址。
物理地址是外部连接使用的、唯一的,它是“与地址总线相对应”。
在内存中的实际地址就是所谓的“物理地址”,而逻辑地址就是逻辑段管理内存而形成的。
对内存偏移之后有了大致印象后,就是下一个点:对指针偏移这块的问题进行了解啦...
PS常识:了解下 ROM 与 RAM 的区别。RAM是指手机内存,属于手机内部存储器,属于随机存储,速度高于ROM,对于手机配置性能起着重要的决定性。ROM则属于外部存储,可以简单的理解为手机硬盘。
备注参考:
http://www.jianshu.com/p/ea34be4ba625
http://www.cleey.com/blog/single/id/776.html
http://www.cnblogs.com/clover-toeic/p/3755401.html