深入理解值类型和引用类型的存储

目录

内存

存储

1)栈区

2)堆区

C#的编译过程

1)源代码

2)公共语言规范(Common Language Specification,CLS) 编译

3)通用中间语言(Microsoft Intermediate Language,CIL或MSIL)

4)公共语言运行库(Common Language Runtime,CLR)编译

5)机器码 (0、1)

局部变量

值类型与引用类型

1)在栈中声明

2)在堆中声明

总结

拆装箱

1)装箱

2)拆箱


       今天来进一步学习值类型和引用的存储,加深对它们的理解,区分值类型和引用类型可以查看【一文读懂】C#区分值类型和引用类型。

 

内存

       首先来了解一下内存,内存是CPU与其它外部存储器交换数据的桥梁,用于存储正在执行的程序与数据,即数据必须加载到内存才能被CPU处理。

 

存储

       程序在运行时,CLR将申请的内存空间从逻辑上进行划分。分为栈区和堆区。

1)栈区

       空间小,读取速度快。用于存储正在执行的方法,分配的空间叫做栈帧。栈帧中存储方法的参数和变量等数据。方法执行完毕后,对应的栈帧将被清除。

2)堆区

       空间大,读取速度慢。用于存储引用类型的数据。

 

C#的编译过程

       上述提到的CLR的与C#的编译过程有关,C#的编译过程可以概括为:源代码→CLS编译→通用中间语言(CIL)→CLR编译→机器码 (0、1)

1)源代码

       开发者编写的 C# 源代码,文件扩展名为 .cs。

2)公共语言规范(Common Language Specification,CLS) 编译

       源代码首先经过CLS编译。CLS 定义了一组规则和标准,确保不同.NET语言之间的互操作性。此步骤确保源代码遵循.NET的语言规则,以便不同语言(如 C#、VB.NET 等)能够相互调用。该过程的目的是实现跨语言。

3)通用中间语言(Microsoft Intermediate Language,CIL或MSIL)

       编译器将符合CLS的C#源代码转换为通用中间语言(CIL)。CIL 是一种与平台无关的低级语言,方便在不同操作系统上运行。

4)公共语言运行库(Common Language Runtime,CLR)编译

       CIL代码在运行时通过公共语言运行库(CLR)进行编译。CLR是.NET的执行环境,负责将 CIL 编译为特定平台的机器码。这一过程通常采用 JIT(即时编译,Just-In-Time Compilation)技术,在代码运行时将 CIL 动态转换为机器码。

5)机器码 (0、1)

       最终,经过CLR编译的代码转变为机器码(即二进制代码,使用0、1表示)。这些机器码是计算机能够直接执行的指令。

 

局部变量

       局部变量是定义在方法内部的变量,有以下特点:没有默认值,必须自行设定初始值,否则不能使用;局部变量随方法被调用时,存在栈中,随方法调用结束时从栈中清除

 

值类型与引用类型

       之前将值类型与引用类型在存储位置上是不同理解为:值类型在栈上分配内存,存储的是数据本身;引用类型:堆上分配内存,存储的是数据的引用(内存地址)。但实际并不全是如此,值类型可能在堆上分配内存。

 

       接下来从值类型和引用类型在栈中和堆中声明的情况来理解它们存储的区别:

1)在栈中声明

       值类型和引用类型变量在栈中声明。

//值类型a,b在栈中声明,数据均存储在栈中
int a = 1;
int b = a;
a = 2;
Debug.Log(b);//1

//引用类型arr1,arr2在栈中声明,数据存储在堆中,栈中储存该数据的引用
int[] arr1 = new int[] { 1 };
int[] arr2 = arr1;
arr1[0] = 2;
Debug.Log(arr2[0]);//2

ca0ddf0777de411d97d288ad2a223357.png

       因为方法在栈中声明,所以在方法中声明的变量都在栈中,此时(方法中的值类型和引用类型变量),因为值类型直接存储数据,所以值类型的数据存储在栈中,因为引用类型存储数据的引用,所以引用类型的数据存储在堆中,栈中存储数据的内存地址。

 

2)在堆中声明

       值类型(arr3的元素)和引用类型(arr4的元素)变量在堆中声明。

//index为值类型,声明在栈中,数据存储在栈中
int index = 0;

//arr3为引用类型,声明在栈中,数据存储在堆中,栈中存储数据的引用
//arr3的元素为值类型,声明在堆中,数据存储在堆中
int[] arr3 = new int[2];
arr3[0] = 1;
arr3[1] = 2;

string[] arr4= new string[1];
arr4[0] = "Hello, world!";
arr4[0] = "Hello, C#!";

a6ca8c8d9a494046b05863bb959275aa.png

 

总结

1)值类型:声明在栈中,数据存储在栈中;声明在堆中,数据存储在堆中。

2)引用类型:声明在栈中,数据存储在堆中,栈中储存该数据的引用;声明在对堆中,数据存储在堆的另一块空间。

 

拆装箱

       这里顺便来了解一下C#的拆装箱子操作:

 

1)装箱

       将值类型隐式转换为objec类型的过程。内部机制:在堆中开辟内存空间,将值类型的数据赋值到堆中,返回堆中新分配对象的地址。

2)拆箱

       将object类型转换为值类型的过程。内部机制:判断给定类型是否是装箱时的类型,返回已装箱实例中属于原值类型字段的地址。

int temp1 = 1;
//装箱操作,比较消耗性能
object o = a;
//拆箱操作,比较消耗性能
int temp2 = (int)o;

       

       好了,本次的分享到这里就结束啦,希望对你有所帮助~

 

 

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

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

相关文章

从陌生到信赖,3款AI写作助手教会了我何为真诚的表达

现在信息多得不得了,写作已经不是只有人才能干的事了。人工智能技术发展得特别快,AI写作助手也开始帮我们写东西了。一开始,我对这些AI助手挺好奇的,后来用着用着就越来越信任它们,甚至有点离不开了。我用的那三款AI写…

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新

ONLYOFFICE 在线编辑器最新版本已经发布,其中包含30多个新功能和500多个错误修复。阅读本文了解所有更新。 关于 ONLYOFFICE 文档 ONLYOFFICE 是一个开源项目,专注于高级和安全的文档处理。坐拥全球超过 1500 万用户,ONLYOFFICE 是在线办公领…

Python日志记录库——loguru

知识星球:知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具知识星球是创作者连接铁杆粉丝,实现知识变现的工具。任何从事创作或艺术的人,例如艺术家、工匠、教师、学术研究、科普等,只要能获得一…

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法,它们不仅帮助我们理解和描述复杂系统的行为,还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发,逐步深入到各种优化算法,并探讨它们在实际问题中的应用。 思维导图文件可获取:https:…

如何指定 Maven 的 JDK 版本?

maven 路径:/data/maven/ jdk 路径:/data/jdk_1.8 1、修改 mvn 可执行文件并指定 JDK 版本 vim /data/maven/bin/mvn # 在开头新增即可... # zhurs add JAVA_HOME PATH JAVA_HOME/data/jdk_1.8 ...保存退出即可! 为什么在此处新增&#x…

C/C++(六)多态

本文将介绍C的另一个基于继承的重要且复杂的机制,多态。 一、多态的概念 多态,就是多种形态,通俗来说就是不同的对象去完成某个行为,会产生不同的状态。 多态严格意义上分为静态多态与动态多态,我们平常说的多态一般…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 :【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法: 跳跃的loop time不要勾选; 相机aim添加垂直阻尼 还是不行,仔细查看是位移时震颤。 UnityCha…

两个mp3音频怎么合成一个?音频合成的多个好用方法教程

两个mp3音频怎么合成一个?在数字音频时代,随着各类音频内容的日益丰富,合并音频文件的需求也愈发突出。无论是为了制作连贯的音乐集,还是为了解决某些场合下音频播放的便利性,将两个或多个MP3音频合并在一起&#xff0…

【C++面试刷题】快排(quick_sort)和堆排(priority_queue)的细节问题

一、快排的快速选择算法两种思路(面试会考)O(N) 快排的三数取中思路: 重要的是将它三个数进行排序最左为最小,中间为次小,最右为最大的数。(错误原因:我刚开始没有将这三个数进行排序&#xff…

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

洞察数据之美:用可视化探索销售与温度的关系

目录 数据可视化1.气温数据可视化图片展示将最高和最低气温合并绘制折线图&#xff1a;将最高和最低气温合并绘制散点图&#xff1a; 2.销售数据可视化几种常见的销售数据可视化方法及其适用场景&#xff1a;图片展示通过热力图和堆叠柱状图的直观展示&#xff0c;可以得出以下…

CAS简介

#1024程序员节&#xff5c;征文# CAS是什么&#xff1f; CAS&#xff08;Compare And Swap&#xff09;&#xff0c;即比较与交换&#xff0c;是一种乐观锁的实现方式&#xff0c;用于在不使用锁的情况下实现多线程之间的变量同步。 CAS操作包含三个操作数&#xff1a;内存位…

【Nginx】win10 安装Nginx

1.下载 nginx: download 2.安装 解压即可 3.启动 可以自己修改端口&#xff0c;conf/nginx.conf 确保端口不被占用cmd启动&#xff08;不要双击nginx.exe启动&#xff0c;至于原因我粘贴一下&#xff09; start nginx.exe 可以看到是后台运行&#xff0c;还不错 访问&…

易基因:Nat Commun:ATAC-seq等揭示恒河猴大脑高分辨率解剖区域的转录组和开放染色质图谱

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 恒河猴是神经科学研究中常用的模型动物&#xff0c;其大脑结构和功能与人类大脑相似。大脑中复杂的遗传网络是灵长类动物行为、认知和情感的基础&#xff0c;一直是神经科学的核心。大脑…

全面了解MindSporeLite轻量化推理工具(概念版)

一、参考资料 技术干货&#xff5c;极速、极智、极简的昇思MindSpore Lite&#xff1a;助力华为Watch更加智能 二、相关概念 MCU MCU的全称是Microcontroller Unit&#xff0c;中文可以称为微控制器或者单片机。MCU既可用于汽车电子、工业控制等领域&#xff0c;也可应用于…

Docker入门之构建

Docker构建概述 Docker Build 实现了客户端-服务器架构&#xff0c;其中&#xff1a; 客户端&#xff1a;Buildx 是用于运行和管理构建的客户端和用户界面。服务器&#xff1a;BuildKit 是处理构建执行的服务器或构建器。 当您调用构建时&#xff0c;Buildx 客户端会向 Bui…

【纯血鸿蒙】安装hdc工具

这里我先写Mac版的,Windows的在下面 首先要知道你的SDK安装在哪里了,不知道的话,可以打开DevEco Studio,打开设置页面里的HarmonyOS SDK,这个我们之前配置环境变量的时候用过。 其实主要是用到这里toolchains下的hdc命令。 所以我们需要配置环境变量。 1、打开Mac下的…

RabbitMQ是一个开源的消息代理和队列服务器

RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;协议实现&#xff0c;同时也支持其他消息协议如STOMP、MQTT等。作为一个可靠的消息传递服务&#xff0c;RabbitMQ在分…

Nginx+Tomcat 动静分离

1. NginxTomcat 环境 Nginx 处理静态资源的优势同样可以应用在 Tomcat 环境中 。从实现方法上来说&#xff0c;NginxTomcat 环境的搭建思路与前面完成的 NginxApache 环境是完全相同的&#xff0c;只需要将 Nginx 与 Tomcat 的站点文档目录配置到同一目录下&#xff0c;利用 N…

Python 打包成 EXE 的方法详解

#1024程序员节&#xff5c;征文# 日常开发中&#xff0c;python由于其便捷性成为了很多人的首选语言&#xff0c;但是python的环境配置也是有点麻烦的&#xff0c;那么我们如何让其变得更加友好呢&#xff1f;没错&#xff0c;就是打包成exe可执行文件。 一、PyInstaller 简介…