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

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆,值类型与引用类型

  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.net/mdeditor/101022949#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型](https://mp.csdn.net/mdeditor/101023885#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1](https://mp.csdn.net/mdeditor/101026168#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2](https://mp.csdn.net/mdeditor/101027584#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复](https://mp.csdn.net/mdeditor/101028008#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能](https://mp.csdn.net/mdeditor/101029557#)
  • 栈与堆,值类型与引用类型
    • 前言
    • 简介
    • 值类型会存储在堆里?
    • 堆栈原理对代码的影响
      • 使用值类型
      • 使用引用类型
        • 第一个示例中
        • 第二个示例
    • 总结

深入浅出图解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)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。


简介

本文将介绍值类型与引用类型在堆栈里的基本存储原理。


值类型会存储在堆里?

是的,值类型有时候就是会存储在堆里。上一节中介绍的黄金规则2:值类型和指针永远存储在它们声明时所在的堆或栈里。如果一个值类型不是在方法中定义的,而是在一个引用类型里,那么此值类型将会被放在这个引用类型里并存储在堆上。

代码图例

我们定义一个引用类型:
在这里插入图片描述
里面包含一个值类型MyValue。
执行下面的方法:
在这里插入图片描述

就像上一节介绍的一样,线程开始执行此方法,参数pValue将会被放到当前线程栈上。
在这里插入图片描述
接下来不同于上一节所介绍的是MyInt是一个引用类型,它将被放到堆上并在栈上放一个指针指向它在堆里的存储。
在这里插入图片描述

当AddFive()执行完成后,如上一节所讲栈开始清理。
在这里插入图片描述

现在是需要C#垃圾回收GC的时候了。当我们的程序所占内存到达临界值时(即将溢出),我们会需要更多的堆空间,GC就会开始运行。GC停止所有当前运行线程(整体停止),找到堆里所有主程序不会访问到的对象并删除它们。然后,GC会识别所有堆里剩下的对象并分配内存空间给它们,同时调整堆和栈里指向它们的指针。你可以想像这是非常耗资源的,这会影响到程序的性能。这就是为什么我们需要理解和注意堆栈的使用,进而写出高性能代码。


堆栈原理对代码的影响

当我们使用引用类型时,我们在和指向引用类型的指针打交道,而不是引用类型本身。
当我们使用值类型时,我们就是在和值类型本身打交道。

代码图例

使用值类型

假设执行方法:
在这里插入图片描述
我们会得到值 3。


使用引用类型

在这里插入图片描述

如果执行方法:
在这里插入图片描述
我们得到的值是4而不是3!(译外话:这是很简单,但相信还是有很多人不知道原理的)


第一个示例中

在这里插入图片描述
在这里插入图片描述
x就是3,y就是4。操作两个不同对象。

第二个示例

在这里插入图片描述
在这里插入图片描述
得到的值是4不是3是因为我们操作栈里两个指针并且它们指向堆里同一个对象。

总结

希望这篇文章能帮助你更好的理解值类型变量与引用类型变量的不同,同时理解什么是指针,什么时候用到指针。以后的文章里会更深入的介绍C#内存管理并详细阐述方法参数。

译文连接:https://blog.csdn.net/leewhoee/article/details/16957545
原文链接:https://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/277469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RFID珠宝门店智能管理设计解决方案

一、项目背景 目前,珠宝行业的盘点工作主要依靠人工操作完成,然而由于珠宝产品体积小、数量大,大数量的产品由少量营业人员花费大量时间进行盘点,这导致盘点效率低下,进而减少了珠宝店在客户营销方面的时间投入。 二、…

1.DQL查询数据(超重点)以及distinct(去重)

DQL(Data Query Language:数据查询语言) 1.所有查询操作都用 SELECT 2.无论是简单的查询还是复杂的查询它都能做 3.数据库中最核心的语言,最重要的语句 4.使用频率最高的语句 语法: SELECT 字段1,字段2,……FROM 表 有时候…

【技术揭秘】软网关BLIoTLink,轻松部署至工控机,实现协议转换网关的快速搭建!

本文教你使用钡铼提供的协议转换软件BLIoTLink ,快速搭载在ARM工控机上,变成迷你边缘计算网关。话不多说,跟着操作起来吧! 功能简介 BLIoTLink是由深圳市钡铼技术有限公司为推进工业物联网发展而研发的一款免费的嵌入式物联网协…

PC9095高性能可调限流OVP过压过流保护 软启动 抗浪涌 集成功率FET开关

特点 •输入电压范围: •PC9095A、PC9095KA:2.5伏~13.5伏 •PC9095B,PC9095KB:2.5伏~10伏 •PC9095C,PC9095KC:2.5伏~5.5伏 •28V绝对最大额定电压VOUT •带外部电阻器的可调限流器 •集成功率FET开关,53mΩRds&#xff08…

php学习05-常量

常量可以理解为值不变的量。常量值被定义后,在脚本的其他任何地方都不能改变。一个常量由英文字母、下划线和数字组成,但数字不能作为首字母出现。 在PHP中使用define()函数来定义常量,该函数的语法格式如下: define(string cons…

#define定义宏

#define的定义范围 #define不光可以定义变量,常量,还可以定义几乎所有的东西,因为#define可以定义一串代码(即宏),所以包含在代码中的东西都能被定义。 #define定义宏 定义是宏名必须于它的参数括号紧挨&am…

web自动化上传文件

1,web 自动化文件上传不要太简单 熟悉 web 自动化测试的大佬应该都懂,当采用 js 调用原生控件进行文件上传的时候,最常用的是使用 pywin32 等系统交互库。 当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址,…

再获认可,YashanDB入选工信部电子一所“2023年数字化转型自主创新解决方案优选案例”

近日,由国家工业信息安全发展研究中心(工业和信息化部电子第一研究所)主办的“数智赋能 创新领航”2023年数字化转型自主创新解决方案优选案例正式公布。深圳计算科学研究院(简称:深算院)自主研发的崖山数据…

校园安全风险管理系统

随着社会的不断发展和进步,教育行业也逐渐走向了信息化、智能化管理。校园作为教育事业的重要场所,其安全和管理问题一直备受关注。为了确保校园的安全和管理,各种校园管理平台应运而生。 其中,凡尔码搭建的校园安全管理系统为校园…

AVL树(超详解)

文章目录 前言AVL树的概念AVL树的实现定义AVL树insert 单旋左单旋右单旋左单旋代码右单旋代码 双旋左右双旋右左双旋 测试AVL树的性能 前言 AVL树是怎么来的呢? 我们知道搜索二叉树会存在退化问题,退化以后就变成单支或者接近单支。 它的效率就变成O(N)…

react 之 美团案例

1.案例展示 2.环境搭建 克隆项目到本地(内置了基础静态组件和模版) git clone http://git.itcast.cn/heimaqianduan/redux-meituan.git 安装所有依赖 npm i 启动mock服务(内置了json-server) npm run serve 启动前端服务 npm…

【React源码 - ReactDom.render发生了什么】

在React开发中,在入口文件我们都会执行ReactDom.render来讲整个应用挂载在主document中,那其中发生了什么,React是如何讲我们写的JSX代码,一步一步更新Fiber进而挂载渲染的呢。本文主要是基于react17.0.2的源码以及自己的理解来简…

linux 内核模块

linux 内核模块 1. 内核相关命令与文件内核模块存放位置查看已加载内核模块加载与卸载内核模块修改内核参数永久调整内核参数 2. 常用模块进程调度模块进程间通信模块内存管理模块文件系统模块网络接口模块 Linux 内核采用的是模块化技术,这样的设计使得系统内核可以…

Jmeter吞吐量控制器总结

吞吐量控制器(Throughput Controller) 场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现。 添加吞吐量控制器 用法1: Percent Executions 在一个线程组内分别建立两个吞吐量控制器, 分别放业务A和业务B …

Docker本地部署开源浏览器Firefox并远程访问进行测试

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器,由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

KaiwuDB 受邀亮相“ACDU 中国行”数据库技术沙龙(西安站)

12月23日,由中国计算机学会(CCF)指导,浪潮数据库、中国数据库联盟、墨天轮数据库社区等联合主办的“ACDU 中国行”数据库技术发展与实践沙龙(西安站)成功举办。KaiwuDB 高级架构师赵衎衎受邀出席沙龙并做主…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

【C语言】程序练习(三)

大家好,这里是争做图书馆扫地僧的小白。非常感谢各位的支持,也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏,内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持,有任何问题欢迎私信与…

【华为数据之道学习笔记】7-3基于物理世界的“硬感知”能力

“硬感知”能力的分类 数据采集方式主要经历了人工采集和自动采集两个阶段。自动采集技术仍在发展中,不同的应用领域所使用的具体技术手段也不同。基于物理世界的“硬感知”依靠的就是数据采集,是将物理对象镜像到数字世界中的主要通道,是构建…

进阶版求字符串长度

大家好呀!!!我是Beilef,一个努力的跨界者,今天带来的每日一题是用简单的函数还有递归求字符串长度。下面开始啦,不对的地方请留言。感谢您的斧正。 文章目录 目录 文章目录 前言 一、题目展示 解题思路&am…