全局变量
所在地址为数据区,生命周期与所在模块一致
使用立即数间接访问
局部变量
所在地址为栈区,生命周期与所在函数作用域一致
使用esp或ebp间接访问
静态变量
全局静态变量:
与全局变量类似,但只能在文件内使用,但这只是在编译之前的语法检查 过程中对访问外部的全局静态变量做出了限制,但在内存结构和访问原理上,静态全局和普通全局变量没有区别,相当于全局静态等价于编译器去做了限制
局部静态变量:
局部静态变量如同全局变量一样,都保存在执行文件中的数据区,但由于静态局部变量被定义在某一作用域内,让我们产生错觉,误认为他是生命起点,其实,局部静态变量预先会被看做是全局变量处理,而它的初始化部分只是在做赋值操作。
当然,之所以能够实现局部静态变量的初始化只会进行一次,是因为设置了标志位,通过标志位来标记该静态局部变量是否已经初始化,如果已经初始化则跳过初始化语句,如果没有初始化,则进行初始化,这个标志位用1个字节来表示
局部静态变量如何做到作用域的限制,这是编译进行了名称粉碎法,在编译期间将静态局部变量重新命名(如同函数重载的实现原理)
堆变量
使用malloc和new进行堆空间申请,利用free和delete进行堆空间释放。内存中,堆结构的每个节点都是使用双向链表的形式存储,每申请的一块内存,将首地址结构体插入到链表,每释放一块内存,则也会把地址结构体从链表中删除