最近又把c#基础的从新拿过来看了一遍,尤其c#高级编程,每次读都有不同层次的理解。这也说明了温故而知新的道理。不啰嗦了回归正题。
CLR内存分为:栈内存 堆内存(和)
ps:堆内存分为:1:SOH(小对象堆内存,small object heap) 对象占内存小于83K内存
2:LOH(大对象堆neic内存)
C#类型分为:值类型和引用类型,其中值类型是内存拷贝
最近发现对值类型的内存分为有点疑惑,故写这篇博客方便以后记忆巩固
值类型通常作为变量:局部变量、全局变量 和常量
局部变量通常定义在类的方法体中,内存分配在栈中,如 Function A(){{int a=1;}{double b=2;}} 当虚拟机执行到该方法,会在栈内存中分配两块内存,内存寻址由高内存地址向下寻址,如内存地址10000开始 a占4个字节 从9999~9996 内存用于存贮a的值,b占 8个字节 从9995~9987存放b的值,当变量超过作用域时候通过压栈的方式,先释放b的内存,再释放a的内存。下次又从内存地址为10000的地方分配内存。栈内 有点: 存速度快,内存消耗少,性能好,确定:必须是连续的、内嵌的。像Function A(){int a=1;double b=2;}内存生命顺序并不是确定的,但是CLR会确保先声明的后删除,即栈的压栈出栈机制
全局变量或者常量是定义的类中,作为类的属性,内存分配在堆中,如 class Person{ int a=1; double b=2; Function A(){ } } 当 function a(){ Person p=new Person() }时候,CLR虚机内存在内存申请如下:
1:栈中申请内存p存放 Person对象堆内存对应的地址(4个字节)
2:a值存放的内存(存放在堆内存中)
3:b值存放的内存(存放在堆内存中)
当p没有被引用的时候会被标记为垃圾,通过GC系统释放内存堆
struct结构体作为值类型引用,内存分配和值类型分配一致,通常结构体只用来存放基础数据类型,但是也可能 结构体中存放对象,尽管不建议这样使用,这个时候结占的内存会有该对象的内存地址。内存分配还是跟值类型一样,根据声明的位置不同,内存分配的位置不同。
实力有限,可能会存在一定误差!