深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

发布时间:2023年12月29日

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

第一篇:堆与栈的理解

前言

.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。


简介

在程序运行时,.NETFramework把对象存储在内存中的两个位置:堆与栈,并且他们都会帮助我们更好的运行程序。堆与栈寄存在电脑的操作内存中,并包含我们需要的信息使整个程序运行正常。


堆与栈:不同点

栈: 或多或少负责追踪正在程序中运行的代码。
堆: 或多或少负责跟踪程序对象或数据。

栈:把它想像成叠在一起的盒子(像搭积木一样)。每一次调用一个方法就会放在最上面叠一个盒子,用来跟踪程序运行情况,我们只能使用栈中叠在 最上面的盒子里的东西。当某一最上面的盒子里的代码执行完毕(如方法执行完成),就把它扔掉并继续去使用下一个盒子。

堆:与栈类似,只是它是用来保存信息而不是跟踪执行。所以,堆里的任何信息都可以在任何时间被访问。有了堆,访问信息没有约束,而不像堆只能访问最上层的盒子。

堆的情况就像你把一堆刚洗完的衣服放在床上还没有时间来的及收走,你可以迅速拿到你想要的衣服。栈的情况就像你叠在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一个盒子。

在这里插入图片描述
注意:
上图并不是真正的内存运行情况,只是为了让大家区分堆与栈。
栈:会自我管理,它有自己的内存管理机制。当最上面的盒子不在使用时,会自动被扔掉。
堆:相反,我们要控制它的垃圾回收(GC)。我们要去管理堆是否干净,就像管理床上的脏衣服。你若不手动扔掉它,就会在床上变臭。


堆和栈中都包含什么

当程序执行时,我们主要有四种类型的东西放进堆和栈里:值类型,引用类型,指针,指令。

值类型

  • bool
  • byte
  • char
  • decimal
  • double
  • enum
  • float
  • int
  • long
  • sbyte
  • short
  • struct
  • uint
  • ulong
  • ushort

它们都是衍生于System.ValueType

引用类型

  • class
  • interface
  • delegate
  • object
  • string

他们都是衍生于system.Object 当然object就是System.Object

指针

第三种被放于内存管理体制中的是类型的引用。这个引用通常叫做指针。我们并不具体的使用指针,他们由CLR(公共语言运行库,是托管代码执行核心中的引擎)管理。一个指针(引用)不同于引用类型在于,当我们说某个东西是引用类型时,意思是我们通过指针访问它。指针是内存中的一块空间,它指向内存中的另一个空间。指针就像我们放入栈和堆中的任何其他东西一样占用空间,它的值要么是内存地址,要么是null。

指令

我们会在后面的文章中介绍指令怎么工作。

引用

原文链接:https://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/

译文连接:https://blog.csdn.net/leewhoee/article/details/16933173

文章来源:https://blog.csdn.net/qq_42194657/article/details/135238104
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。