c#堆与栈
2021-04-02 12:25
标签:run 函数的参数 实例 结束 值类型 地方 需要 src 创建 一、在讲堆栈之前,我们先看看值类型和引用类型: 1,我们看看值类型与引用类型的存储方式: 引用类型:引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用还是存储在栈中。 值类型:值类型总是分配在它声明的地方,做为局部变量时,存储在栈上;类对象的字段时,则跟随此类存储在堆中。 什么是堆什么是栈我们后面解释。 图1-1 2,我们再看看引用类型与值类型的区别: ①引用类型和值类型都继承自Systerm.Object类。不同之处,几乎所有的引用类型都是直接从Systerm.Object继承,而值类型则是继承Systerm.Object的子类Systerm.ValueType类。 ②我们在给引用类型的变量赋值的时候,其实只是赋值了对象的引用;而给值类型变量赋值的时候是创建了一个副本(副本不明白?说通俗点,就是克隆了一个变量)。 文字不够形象?我们上代码看看 图1-2 3,我们再看看引用类型和值类型的内存分配情况(我们对着代码与图看) 图1-3 图1-4 看了图1-3和图1-4之后,你们可能问我了:你是怎么知道变量在栈中的地址的。嘿嘿,等下教你用c#玩指针 从上面两张图我们可以看出: ①栈的结构是后进先出,也就是说:变量j的生命周期在变量s之前结束,变量s的生命周期在变量i之前结束, ②栈地址从高往底分配 ③类型的引用也存储在栈中 二、对于堆和栈的详细介绍,我们往下看。 1,有人老是搞不明白堆和栈的叫法。我来解释下: 堆:在c里面叫堆,在c#里面其实叫托管堆。为什么叫托管堆,我们往下看。 栈:就是堆栈,因为和堆一起叫着别扭,就简称栈了。 2,托管堆: 托管堆不同于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾。所以,做为.net开发,我们不需要关心内存释放的问题。 3,有人老是搞不清楚内存堆栈与数据结构堆栈,我们来看看什么是内存堆栈,什么是数据结构堆栈 ①数据结构堆栈:是一种后进先出的数据结构,它是一个概念,图4-1中可以看出,栈是一种后进先出的数据结构。 ②内存堆栈:存在内存中的两个存储区(堆区,栈区)。 栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放 堆区:存放着引用类型的对象,由CLR释放 c#堆与栈 标签:run 函数的参数 实例 结束 值类型 地方 需要 src 创建 原文地址:https://www.cnblogs.com/weihengblogs/p/9218794.html