1:如果这个int变量是在main或其它方法中定义的,那么他存储在栈空间中,栈就是内存中一块用来存储数据的连续空间,通过esp和ebp两个寄存器来控制范围。每个函数都有一个对应的栈空间,进入main时,main就会分得一块栈空间,里边保存着函数返回地址,函数参数,局部变量等。当main函数又调用了其它函数时,就会对刚才的栈空间进行保存。然后在紧挨着原栈空间的上方(比原来地址低的地址处)重新划分一块空间存放新调用的方法所需要的数据,同样也是由esp和ebp两个寄存器来控制的。更多细节需要有一定的汇编知识才能解决!形象地来说,一叠盘子罗在一起(每个盘子就是main需要的数据),当main又调用其它方法时,在这罗盘子上又依次罗上了若干个盘子。当退出这个方法时,上边的盘子就会被拿掉(后进先出)这也是为什么在一个方法中定义的变量可以和其它方法中的变量同名,一个方法中的变量一旦出了方法的作用域就不能再调用的原因。这也是使用栈空间存储数据所所据有的灵活性!
2:如果这个int类型是在类中定义的,那么这个int变量就会被分配到堆空间中。堆是内存中很大的一块空间,也是用于存放数据的。他存活的时间由引用决定。如果有一个引用指向了堆空间。也就是有对象被使用。那么他就会一直存活着,如果这个引用被重新赋值指向了其它对象,若引用被赋值为null那么c#中的垃圾回收机制就会启动,来释放这个堆空间。而在C++中释放堆空间完全是由程序员所决定的,如果程序员一旦忘记释放堆空间,就有可能出现内存用完的情况,最终导致崩溃!也就是所谓的内存泄漏。这种情况下程序结束后,操作系统也会回收这些空间。
3:其它情况。像静态变量,全局变量又会存放在另外一些空间中(如全局数据区)。不同的需要存放不同的空间。各有优点,也各有缺点 |