C++ - 几类变量(局部、静态、静态全局、全局)简介
主要介绍下如题几类变量,也是比较容易弄混的四类变量,每一中变量都应该有自己独特的部分,才有存在的价值;
存储区域 | 作用域与生存时间 | |
局部变量 | 栈区 | 局部;在作用域内 |
全局变量 | 静态存储区 | 全局,多个源文件中可以使用;整个程序执行期间 |
静态局部变量 | 静态存储区 | 局部;整个程序执行期间 |
静态全局变量 | 静态存储区 | 全局,只能在本文件中使用;整个程序执行期间 |
所以说其实每类变量都会有自己与众不同的地方,对于局部变量,可以用于在局部作用域中使用,其余地方不访问,对变量有一定的保护作用,并且每次进入执行都会是一样的,
它的值不需要一直保存着,而如果想作用于局部,而且希望下次调用的使用该变量仍然能够保存上次的值,那么就可以使用静态局部变量。
静态存储区:是内存中的一块特殊的区域,若变量存储在静态存储区,会在程序编译的时候就为其分配空间,然后生存时间是整个程序执行期间。
对于C++内存区划分可以参考: C/C++堆、栈及静态数据区详解
分为五个区,堆、栈、自由存储区、静态存储区、常量存储区。
还是主要介绍下该如何查看存储的数据,主要说明存储在哪?什么时候分配?(Win8+VS2012)
断点设置在开始执行的位置,可以发现c、d、a都已经分配好空间了,并且都在同一区域(但我现在还不能证明这就是静态存储区),可以发现这块区域初始化都是0,因此不会是栈区,而且可以看出是四字节的整型数,并且按照c、d、a的顺序分配。
然后再看局部变量的分配,应该是在栈区,而对于栈区部分可以知道如果定义一个变量没有赋予初值,一般在VC里面会填充0xCC,所以对于栈区一般是会有很多被填充0xCC的区域:
可以从反汇编中看到这块区域,周围部分未使用(初始化)区域被填充的0xCC,这也是栈区的一个特征,所以基本上能够说明局部变量的确是被放置在栈区。
具体内存信息分配可以参考:内存区域的划分及堆栈的详解
其实前面是想通过定位函数调用,即在windows下面如果在堆中分配空间,会调用HeapAlloc函数,局部变量栈中分配会调用LocalAlloc函数之类的,但是不知道该如果调试定位进入该函数调用,望路过的大牛指导 ^^