黑马程序员_学习日记6_C#基础归纳总结之堆栈分配图解

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

当你声明一个变量时内存中都发生了什么?

当你在一个.Net应用程序中声明一个变量时,首先要分配一些内存快到RAM,它包括三样东西,第一个是变量名,第二个是变量的数据类型,最后一个是变量的值。

这只是一个很简单的解释,根据变量的数据类型不同,有两种内存分配类型:堆栈内存和堆内存。

 

2声明变量后的内存结构

 

堆栈(stack)和堆(heap

为了帮助理解堆栈和堆,让我们了解下面的代码内部究竟发生了什么。

1.            public void Method1()  
2.            {  
3.            // Line 1  
4.            int i=4;  
5.            // Line 2  
6.            int y=2;  
7.            //Line 3  
8.            class1 cls1 = new class1();  
9.            

这个方法内部只有三行代码,下面我就逐行解释内部发生了什么事情。

第一行:执行该行时,编译器分配一小块叫做堆栈的内存,堆栈负责保持跟踪应用程序运行需要的内存。

第二行:现在执行移动到下一步,正如堆栈的名称所暗示的那样,这个内存分配时叠放在前一个内存分配顶部的,你可以将堆栈理解为一系列隔间或盒子的逐层堆积。

内存分配和解除分配使用LIFOLast in first out,后进先出)逻辑,换句话说就是内存是在内存的末尾(如堆栈的顶部)分配和解除分配的。

第三行:在第三行我们创建了一个对象,执行该行时,它在堆栈上创建一个指针,真实的对象是存储一个不同类型的内存分配(叫做堆)中,堆不会跟踪运行的内存,它只是对象的堆积,堆用于动态内存分配。

退出方法(有趣):执行完最后一行代码后就该退出这个方法了,当它传递结束控制时,它就会清除分配到堆栈上的所有内存变量,换句话说就是所有与int数据类型关联的变量按照LIFO方式从堆栈中解除分配。

但不会解除堆内存分配,这部分内存要通过GARBAGE COLLECTOR(垃圾回收器)解除分配。

                                                                                                                               

3三行代码对应的内存内部操作

很多人现在可能要问为什么要设置两种内存分配形式呢?难道就不能用一种内存分配形式完成内存分配吗?

如果你仔细观察上图,你就会知道int变量是分配在堆栈上的,因为编译器已经知道它们可以存储多少数据(-2,147,483,6482,147,483,647),涉及到对象时,编译器不知道需要多少内部空间,因此在堆上分配相同大小的空间。

换句话说就是,如果不知道数据大小或是动态变化的,就需要分配到堆上,如果数据大小是确定的,就分配到堆栈上。

 

 

4知道变量大小时分配到堆栈上,不知道变量大小时分配到堆上

值类型和引用类型

值类型指的是在相同的位置同时容纳数据和内存的类型,而引用类型是借助一个指针指向内存位置。下面是一个简单的命名为i的整数数据类型,其值是由另一个命名为j的整数数据类型赋予的,这两个内存值都是基于堆栈分配的。

当我们将一个int值赋给另一个int值时,它创建一个完全不同的拷贝,换句话说就是,你修改其中一个值不会引起另一个值也发生变化,这种数据类型就叫做值类型。

 

 

5值类型:一个值的变化不会引起另一个值变化

当我们将一个对象赋值给另一个对象时,它们指向相同的内存位置,如下图所示,当我们将obj赋值给obj1时,它们指向的内存位置是一样的。换句话说就是,如果我们修改了其中一个对象,另一个对象也会受到影响,这种类型就叫做引用类型。

                                                         

 

6引用类型:一个对象的变化会引起另一个对象的变化

哪一个数据类型是值类型和引用类型呢?

.Net中,根据数据类型不同,变量可能是基于堆栈分配的,也可能是基于堆分配的,StringObjects是引用类型,其它.Net数据类型是基于堆栈分配的,下图更详细地进行了解释。

 

 

 

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
详细请查看: http://net.itheima.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值