谈谈.Net中struct与class
谈这个问题之前,须清楚语言中两大数据类型:值类型和引用类型,当然仅从语言层面上来说可能已经非常清楚两者具体的范畴,比如说值类型包括简单数据类型
、结构体、和枚举;引用类型包括类、数组、接口、委托等,当然基础问题还是要搞清楚,但本文不会care这些概念上的描述,而从Element方面进行剖析。
下面直接引用一些观点:
1. 值类型直接存储值,变量本身的内存空间存储其实际的数据;引用类型指向的内存空间保存的是值得内存引用,即实际数据的内存地址;
2. 内存分配原型上的差别,若要谈清楚这个问题,就需要对clr的不同的内存区域有清晰的认识:Thread Stack(线程堆栈)和 Managed Heap(托管堆)。shit很明显已经陷入了用一个
概念去解释另一个概念的怪圈,认识这个问题当然先要知道manged code 与unmanaged code(搞那么麻烦)。
简单来说,Managed Code(托管代码),是基于.Net Framework的,运行在framework内,这些Code能够直接被CLR执行,凡是在.Net Framework
框架内的任何语言code都是Managed Code。使用CLR的Managed Code能够通过内存管理、安全处理、跨语言调试等能够给应用程序提供一个良好的执行
环境。
有了这个概念之后对Unmanged code的理解也就清晰了,如果不是基于.Net Framework,而是在Framework之外开发的code都应该是unmanaged code了。
此类语言开发的应用程序不会受CLR的控制,因此也被称为不受托管的。像C++此类的语言就能够不受CLR控制的应用开发。
那么,针对程序运行时来说,每个Thread都会有自己的线程空间用于存储临时变量或者局部变量,大小大概为1M的存储空间,这块空间就被称作是线程堆栈。另外由CLR自行管理的成为“托管堆”。“线程堆栈”的分配与释放
无须主动干预,由线程自身进行相关堆栈的分配与free。而托管堆的分配则可以主动进行,最常见的方式是采用new关键字进行对象分配。
再回到最开始的数据类型的空间分配的问题,值类型的数据变量通常是在当前线程空间上进行的堆栈分配,
=下班了,回家写。=

浙公网安备 33010602011771号