程序是怎么划分内存的
内存分为四大块:栈区(stack),堆区(heap),静态区(static),代码区(code)
(图一)
(每个区所完成的工作)
栈区:存放基本数据类型(int bool string等等...) ,地址引用(比如:有一个Dog类。Dog d = new Dog();这个d的地址就是存放在栈区,d只是一个十六进制数)
堆区:简单的理解就是所有new 出来的东西都是放在堆区
静态区:顾名思义就是存放static数据(还记一点就是它还存放全局变量,例如Session,php里面的Global这些都是放在表态区的)
代码区:就是程序进行编译的时候就把你所要执行的代码放到这个区里面
接一下我们一起主要探讨一下栈和堆特性
在讲它的特性之前容我先讲一个生活案例,比如说:学校宿管人员把钥匙用杯子把学校所有钥匙放在杯子里面在,在新生来住校的时候就会给学生钥匙,那么宿管就会从杯子里面从上到下把钥匙拿出来给学生,学生拿到钥匙就可以根据钥匙上面的编号找到自己对应的宿舍房间了。
在这里我们可以把那个杯子可以理解为栈(第一:这个杯子里面的钥匙它是先进去的,在最下面。后进去的在最上面。第二:这个杯子的容量较小不需要太大)
而房间可以理解为堆了。(只有有了钥匙才可以有进房间,在这里我们可以理解为只有栈区指向堆的时候编译器才会在堆区开劈空间)
总结:
栈区:它是先进后出,它的效率较快,但储存有限
堆区:它是根据栈区来分配内存的,它的储存要比栈区的要大
int age = 10; Fruit fruit = new Fruit(); fruit.fruitName = "香蕉"; string info = fruit.GetInfo(); Fruit.fruitCount = 20; /// <summary> /// 水果类 /// </summary> public class Fruit { //水果名 public string fruitName { get; set; } //水果总数 public static int fruitCount { get; set; } /// <summary> /// 构造 /// </summary> public Fruit() { Console.WriteLine(@"构造方法调用"); } /// <summary> /// 获取水果信息 /// </summary> /// <returns></returns> public string GetInfo() { return new StringBuilder(5).AppendLine("主要成分:").AppendLine("维生素C").ToString(); } }
(上面代码内存分析图)
(图二)
(PS:文章如有误,愿见谅。希望能指出来,怕误人子弟了。^_^)