首页 > 代码库 > 《计算机中可编程内存分析》
《计算机中可编程内存分析》
博主最近刚看了一些斯坦福大学的内存分析课,结合以前做的内存分析, 今天将计算机中可编程的内存做一个分析。
在计算机的可编程内存中,我们一般分为三个区域:静态存储区,栈区,堆区。内存模型如下所示:
静态内存区在程序编译的时候就已经被分配完毕,这块内存在整个计算机内存中位于较低的地址(例如0000),这块内存在整个程序运行期间都存在,静态内存区主要存放的是静态变量、全局变量、常量。
堆区:我们有时候也将堆区称作动态内存区分配区,程序再运行的时候通过new关键字申请得到的任意大小的内存(我们使用new申请到的变量也被称为堆变量)都被存放在堆内存中,这些动态内存的生命周期由程序员自己决定,如果程序员不去释放堆内存,那么当程序执行完毕的时候,系统会自动将该内存释放。但是一个有着良好编程习惯的程序员,当他们不再使用这些动态内存的时候,就将其释放掉。堆内存一般处于内存较低的地址(例如:1000,但是堆内存的内存地址高于静态内存区的内存地址),从内存分析图中我想告诉大家的是:堆内存存储数据是从低地址往高地址存储数据。
栈区:栈内存一般存在于内存较高的地址,函数的局部变量都在栈内存中被创建,当函数执行结束的时候,栈会自动释放用于存放局部变量的内存单元。由于栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存空间相当有限(栈帧就是栈内存中所分配的内存空间)。这里我们多说一句,我们在栈帧上会首先存放额外的内存开销,然后再存储函数里传进来的变量。所有的基本类型变量都存放在栈中。从内存分析图中我想告诉大家的是:栈内存存储数据是从高地址(例如:FFFF)往低地址存储。 当栈内存和堆内存在存储数据的过程中发生重叠的时候,计算机就会崩溃,但是由于现代计算机的存储容量相当大,故不必担心这个现象。
最后我们进行一个总结:对于堆区、栈区和静态存储区它们之间最大的不同在于,栈的生命周期很短暂(其存储数据的生命周期在函数执行结束时结束)。但是堆区和静态存储区的生命周期相当于与程序的生命同时存在(如果您不在程序运行中间将堆内存delete的话),我们将这种变量或数据成为全局变量或数据。但是,对于堆区的内存空间使用更加灵活,因为它允许你在不需要它的时候,随时将它释放掉,而静态存储区将一直存在于程序的整个生命周期中。
由于本人水平有限,欢迎各位同行批评指正。
《计算机中可编程内存分析》