栈、堆、静态存储区
可编程内存基本上分为几大部分:栈区、堆区和静态存储区。
1.栈(stack)
保存局部变量和局部函数的,函数结束,其局部变量和参数的生命就结束了(当然是不包括static变量)。即释放了栈的空间(顺便提一下:栈特点为后进先出的!)。
函数被调用的时候需要push(压栈),函数return后需要pop(弹栈)。
栈的分配运算内置于处理器的指令集中,效率极高,但是分配的内存容量有限。
2.堆(heap)
也称动态内存分配区。
程序员向操作系统申请的内存空间。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。可存储较大的数据。
堆是以匿名方式保存的,只能通过指针访问,安全性最高,由程序员分配与释放,自由度最高!
3.静态存储区
内存在程序编译的时候已经分配好。这块内存在整个程序的运行期间都存在。
主要存放静态数据、全局数据和常量。
**************************************************************************
堆栈的不同:
(1)内存申请方式的不同:如果函数中声明一个局部变量int a,系统会自动在栈中为a 开辟空间;而堆空间需要程序员自己申请,还需要指明变量的大小。
(2)系统响应的不同:只要栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则提示overflow,栈溢出;而对于堆,系统在收到申请空间的要求后,遍历操作系统用于记录内存空间地址的链表,当找到一个空间大于所申请空间的堆结点后,就会将该结点从记录内存空闲地址的链表中删除。并将该结点的内存分配给程序,然后在这块内存区域的首地址处记录分配的大小。这样在使用delete来释放的时候,delete才能正确识别并删除该内存区域的所有变量。另外,申请的内存空间与堆结点的内存空间不一定相等,这是系统个会自动将堆结点上多出来的那一部分内存空间回收到空闲链表中。
(3)空间大小的不同:栈是一块连续的区域,大小在编译时就确定的常数,有系统预先根据栈顶的地址和栈的最大容量定义好的;堆是不连续的区域,各块区域由链表串联起来。串联起来的内存空间叫作堆!上限是由系统的虚拟内存来定的。
(4)执行效率的不同:栈比较快,由系统自动分批;堆速度较慢,且容易产生内存碎片。
(5)执行函数时的不同:函数调用时,第一个进栈的是被调函数下一行的内存地址(栈的先进后出)。其次是函数的参数,假如参数duo与一个,那么次序是从右往左。最后才是函数的局部变量。
如:
g(a,b); //第二个进栈 cout<<a; //第一个进栈
在栈分布(从上到下):
局部变量
参数a
参数b
第二行代码
不可能有内存碎片。进来有序,退出有序....
存储在栈中的对象,遇到 } ,即删除局部变量。
**************************************************************************
附:其他区域(或者其他叫法)
(1)数据段(属于数据存储区)是存取全局变量和静态变量的。全局变量和静态变量是放在一块的,初始化的在一块区域,未初始化的在相邻的另一块区域。程序结束后由系统释放。
(2)代码段是存取函数体的二进制代码的。
(3)文字常量区,常量和字符串就放在这里,程序结束之后由系统释放。
(4)寄存器区,用来保存栈顶指针和指令指针。
****************************************************************************
与存储类型相关的几个属性:
atuo:在声明局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。
static:在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
register:在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
extern:用于扩展全局变量的作用域,比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义的全局变量。此外,extern 还可以在多文件的程序中声明外部变量。
在Linux中还存在这一个BBS段!
可参考http://blog.csdn.net/jxhui23/article/details/8064766