C# 值类型和引用类型的性能比较

值类型都继承自System.ValueType,引用类型的继承链上没有System.ValueType,但是System.object是所有类的基类。C#的结构类型,比如int32等。

结构类型不能继承,但是可以实现接口。

为什么说结构不能继承,但是又继承于System.ValueType,而结构是值类型,其根基类是引用类型?这主要是因为微软对值类型进行了特殊的处理,CLR会自动给值类型分配栈上空间,引用类型分配堆内存。

在介绍值类型和引用类型的性能之前,我们需要先知道堆和栈空间:

对于一个32位操作系统,一个进程可以分配4G的虚拟内存,对于C#而言,虚拟内存空间就会被分配为堆栈和托管堆两个部分。

栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FILO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。  
  堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。  

总而言之,程序运行时,会分配一个虚拟内存空间,其中有两个存储变量的区域,分别是堆栈和托管堆。堆栈上来存放值类型,托管堆来存放引用类型。

堆栈是操作系统在线程中创建的具有FILO特性,在生成新的对象或者对象离开其作用范围后栈指针就会不断移动,所以它的效率非常高,但是对于很大的对象如果作为值类型放在栈则会降低效率,我们可以通过一个指针(32位机器是4个字节)放在栈中,将其所引用的对象放在堆中,有助于提高效率。那么这一部分的内存空间就需要通过GC来进行释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值