usr*_*ΛΩΝ 27
以下是一个更详细的解释,它介绍了Common Language Runtime的内部.
首先,让我们区分值类型和引用类型:
如果您不知道堆栈是什么(不要被冒犯),它是一个存储区域,它在方法中保存局部变量,并用于return指令的调用函数地址(只是简短并提供一般答案).当您调用方法时,堆栈上的足够区域将静态分配给它,因此堆栈分配始终称为静态分配.
相反,堆是一个与堆栈分离的内存区域,运行进程的属性,首先必须对操作系统进行分配,这就是为什么它被称为动态分配(如果你不在if语句中运行)例如,可能不会为您的进程分配内存,而是始终分配堆栈).
只是为了在堆和堆栈上做一个最后的例子:在C++这样的语言中,声明int[100] a;静态地在堆栈上分配100*8个字节(假设为64位系统),同时int* a = new int[100];声明一个8字节(在64位系统上)区域堆栈AND请求堆上的800多个字节,如果可用的话.
现在让我们来谈谈C#:
由于int是一个值类型,并且在堆栈上分配,当你将它转换为object或任何其他引用类型时(实际上没有其他int可以继承的引用类型,但它是一般规则),该值必须是必需的参考类型.因此,堆上的新区域被分配,对象被装入其中,并且堆栈包含指向它的指针.
正好相反:当你有一个引用类型,如对象,并希望将其转换为一个值类型,如int,则新的值必须在堆栈上举行,所以CLR去堆,联合国盒的value并将其复制到堆栈中.
还记得int[]和int*例子吗?简单地说,当您使用intC#时,运行时期望其堆栈位置保持该值,但是当您拥有该值时object,它期望其实际值位于堆栈指向的堆位置.
| 归档时间: |
|
| 查看次数: |
14596 次 |
| 最近记录: |