C#基础之内存分配
2016-05-30 17:00
316 查看
1.创建一个对象
一个对象的创建过程主要分为内存分配和初始化两个环节。在.NET中CLR管理的内存区域主要有三部分:栈、GC堆、LOH堆,栈主要用来分配值类型数据。它的管理是有系统控制的,而不是像GC堆那样是由GC控制的。当线程执行完值类型实例所在方法后,这块空间将会被自动释放,一般栈的执行效率高不过容量有限。GC堆用来分配小对象实例,它是由GC完全控制内存的分配和回收。LOH堆则是为大对象实例准备的,它不会被压缩且只在GC完全回收时才会回收。在IL中可以看到newobj、ldstr(创建string对象)、newarr(用于分配新的数组对象)、box(装箱)等常见的创建对象的指令。当然在堆上也存在值类型,比如值类型作为类的字段时,它将存储在堆中的实例对象空间,还有装箱时也会让堆上存在值类型。好了接下来我们来看看创建一个对象的内存分配,现在有一个Person类和Student类。那么这句Student s = new Student() { studentId = 2, Id = 4 };执行完后s对象就被创建了,下面我画了张图来说明创建一个对象时内存的分配,其中s对象还有同步索引块与类型对象指针我没有画出来。
View Code
一个对象的创建过程主要分为内存分配和初始化两个环节。在.NET中CLR管理的内存区域主要有三部分:栈、GC堆、LOH堆,栈主要用来分配值类型数据。它的管理是有系统控制的,而不是像GC堆那样是由GC控制的。当线程执行完值类型实例所在方法后,这块空间将会被自动释放,一般栈的执行效率高不过容量有限。GC堆用来分配小对象实例,它是由GC完全控制内存的分配和回收。LOH堆则是为大对象实例准备的,它不会被压缩且只在GC完全回收时才会回收。在IL中可以看到newobj、ldstr(创建string对象)、newarr(用于分配新的数组对象)、box(装箱)等常见的创建对象的指令。当然在堆上也存在值类型,比如值类型作为类的字段时,它将存储在堆中的实例对象空间,还有装箱时也会让堆上存在值类型。好了接下来我们来看看创建一个对象的内存分配,现在有一个Person类和Student类。那么这句Student s = new Student() { studentId = 2, Id = 4 };执行完后s对象就被创建了,下面我画了张图来说明创建一个对象时内存的分配,其中s对象还有同步索引块与类型对象指针我没有画出来。
public class James:Student { public string name; public override void Eat() { Console.WriteLine("James 在吃梨"); } public override void Walk() { Console.WriteLine("James 在散步"); } public override void Run() { Console.WriteLine("James 在跑步"); } public override void SayHi() { Console.WriteLine("James说:你好!"); } }
View Code
相关文章推荐
- C# 窗体应用程序制作虚拟键盘按键功能
- C#截取字符串(String.Substring方法)
- C#委托与代理
- C#遍历Dictionary
- 基础知识系列☞C#中→属性和字段的区别
- C#文件创建与使用 冲突问题
- C#学习笔记之ListView控件
- C# 线程间不能调用剪切板的问题 续集
- C#学习笔记之PrintDocument打印
- C# 复习笔记 消息与事件处理
- WinForm实现简单的拖拽文件到出题的功能(C#)(3)
- C# 中的委托和事件
- dataGridView绑定数据
- C# Pascal 命名规则
- C#学习笔记之Socket
- C#winform界面刷新
- C#学习笔记之线程调用带参数的方法
- C#用链式方法表达循环嵌套
- C#泛型约束
- C#学习笔记之线程