1.栈区 stack
- 保存局部变量和局部函数。当函数结束时,其局部变量和参数的生命随之结束(不包括static变量)。由系统释放
- 函数被调用时需要push压栈,函数结束时需要pop弹栈。
- 栈是一块连续的区域,其大小在编译时就确定的常数。
2.堆区 heap 动态内存分配区
- 由程序员向系统申请和释放,通过malloc、new和free、delete
- 堆是不连续的区域,各区域由链表串联起来的内存空间叫堆。
3.静态存储区
- 指的是内存在编译时已经分配好,这块内存在整个程序运行阶段都存在。
- 主要存放静态数据、常量、全局数据
与存储类型相关的几个属性:
atuo:在声明局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。
static:在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
register:在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)
extern:用于扩展全局变量的作用域,比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义的全局变量。此外,extern 还可以在多文件的程序中声明外部变量。
参考:https://www.cnblogs.com/simonLiang/p/5729649.html 栈、堆、静态存储区