浅谈c# CLR内存分配

最近又把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结构体作为值类型引用,内存分配和值类型分配一致,通常结构体只用来存放基础数据类型,但是也可能 结构体中存放对象,尽管不建议这样使用,这个时候结占的内存会有该对象的内存地址。内存分配还是跟值类型一样,根据声明的位置不同,内存分配的位置不同。

实力有限,可能会存在一定误差!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值