Unity值类型和引用类型

我们都知道C#编程语言中,数据类型被分为了两种:

  1. 值类型
  2. 引用类型

那么什么是值类型?什么是引用类型呢?它们的区别又是什么?

为了搞清楚这些问题,我们先列举一下我们开发中会碰到的值类型和引用类型。

  • 常见的值类型为:byte,short,int,long,float,double,decimal,char,bool 和 struct
  • 常见的引用类型为:class array interface delegate string System.Object dynamic

为了更清晰的对比值类型和引用类型,我们从内存的分配和回收两个角度来进行分析

内存分配

我们都知道,创建对象就需要有一块内存来承载相应的对象,我们也知道,在程序运行过程中内存会分为栈内存和堆内存,那么到底我们的值类型和引用类型的内存是分配在哪块内存上了呢?
要搞清楚这个问题首先我们先要了解值类型和堆内存,内存分配的差异:

  • 值类型只需要一段单独的内存,用于存储实际的数据

  • 引用类型需要存储两段内存

    • 第一段存储实际的数据。
    • 第二段存储的是一个引用,指向实际数据的存放位置。

    其实很多熟悉开发的小伙伴都口熟能详的知道一个概念,“值类型被存储在内存栈上,引用类型被存储在内存堆上”。这句话对不对呢。继续往下看…
    其实这句话呢,也对也不对,但要分使用场景

    数据不是其它类型的成员的情况下“值类型被存储在内存栈上,引用类型被存储在内存堆上”,大致如下图所示:
    在这里插入图片描述

但我们实际开发中很多时候类型都不是单独存在的,看下面的一段代码:

  public class ClassA{public int a;public string b;}

看到代码是不是感觉 a内存分配在内存栈,b内存分配在内存堆。很遗憾,实际情况是a和b都被分配在内存堆中。

那么哪个环节出现问题了呢?
因为a是ClassA的成员属性,而ClassA是一个引用类型,所以ClassA的数据部分是被存储在内存堆上的,大致如下图所示:
在这里插入图片描述

总结:

引用类型的数据一定是被分配在内存堆上的,而引用类型的引用以及值类型的数据却并不一定分配在内存栈上。

  1. 局部变量:

引用类型的引用和值类型的数据分配在内存栈上

  1. 公共变量

引用类型的引用和值类型的数据的分配根承载它的对象所在的内存有关,如果承载它的对象在堆内存中那么它就跟着被分在堆内存中,如果承载它的对象被分配在栈内存中那么它就跟着被分在栈内存中。

内存回收

在说回收之前我们需要先了解一下栈内存和堆内存的定义和结构如下:

栈内存

栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境、传递给方法的参数。

栈的特点:(1)数据只能从栈的顶端插入和删除。(2)把数据放到栈顶称为入栈。(3)从栈顶删除数据称为出栈。(4)内存连续 (5)内存自行维护

堆内存

堆是一块内存区域,在堆里可以分配大块的内存用于存储某种类型的数据对象。与栈不同,堆里的内存能够以任意顺序存入和移除。
堆的特点: (1)内存无序。 (2)内存不可自行维护需要借助CLR的GC机制

由于栈内存的内存连续性以及内存的自行维护,所以栈内存的申请和释放相对于堆内存要快。
而堆内存的内存回收完全借助于CLR的GC机制,什么时候回收几乎是不可控的,且由于堆内存的不连续性的特点,在GC之后容易产生内存碎片,从而造成内存浪费。

什么时候触发GC?

  1. 在堆内存上进行内存分配操作时,内存不够的时候会触发GC
  2. 自动触发,Unity会不定时的自动触发GC
  3. 代码强制执行

GC是怎样工作的?

  1. 挂起所有正在运行的线程
  2. 检查堆内存上的每个对象
  3. 搜索对象的所有引用
  4. 没有被引用的对象都是垃圾,被标记为可删除
  5. 遍历删除所有被标记的对象,释放内存

看到GC的工作机制你就会知道一次GC是多么的困难,并且随着我们的程序复杂性的提高,占用的CPU算力也会越高就会造成程序卡顿,所以在项目开发过程中我们一定要想办法减少GC,或选择在合适的位置进行GC

怎么减少GC?

  1. 对象池
  2. stringbuilder的使用
  3. 减少装箱操作
  4. 避免频繁的调用协程,每一次StartCoroutine()实际上是new一个新的对象
  5. 用for代替foreach foreach会在堆上产生一个system.object

最后我们简单用一个示例图来模拟一下一个引用类型的申请:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI+老照片焕新】母亲节用AI把时间的印记变成暖心礼物

想念是一张泛黄的照片,藏在抽屉里的笑容,总是那么亲切。今天是母亲节,是不是想给妈妈来点不一样的惊喜?用AI技术,把那些老照片瞬间焕新,让妈妈的青春记忆重放光华! 想象一下,妈妈年…

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中,简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验,还体现了你对所申请职位的理解和热情。然而,如何从招聘信息中提炼关键点,打造…

scrapy的入门

今天我们先学习一下scrapy的入门,Scrapy是一个快速的高层次的网页爬取和网页抓取框架,用于爬取网站并从页面中提取结构化的数据。 1. scrapy的概念和流程 1.1 scrapy的概念 我们先来了解一下scrapy的概念,什么是scrapy: Scrapy是一个Python编写的开源网络爬虫框架…

WebSocket前后端建立以及使用

1、什么是WebSocket WebSocket 是一种在 Web 应用程序中实现双向通信的协议。它提供了一种持久化的连接,允许服务器主动向客户端推送数据,同时也允许客户端向服务器发送数据,实现了实时的双向通信。 这部分直接说你可能听不懂;我…

王麻子1651商标被王麻子跨类无效宣告!

近日“王麻子1651”商标被王麻子跨类无效宣告,最后不予注册,普推知产老杨了解“王麻子”是我国著名的老字号,创始于1651年,以刀剪闻名于世,刀剪的商标分类主要是在8类手工器械,而被无效宣告的商标在16类办公…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具,其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息,还能有效提高工作效率。然而,市场上很多便签应用仅限于单一平台使用,对于需要在手机和电脑间频繁切换…

如何到《新英格兰医学杂志》 NEJM查找下载文献

《新英格兰医学杂志》NEJM是世界上阅读、引用最广泛、影响力最大的综合性医学期刊之一。NEJM集团出版的期刊还包括NEJM Journal Watch、NEJM Catalyst及NEJM Evidence。NEJM是一份全科医学周刊,出版对生物医学科学与临床实践具有重要意义的一系列主题方面的医学研究…

json-server 模拟接口服务

前端开发经常需要模拟接口请求,可以通过 json-server 实现。 1. 安装 json-server 在前端项目的终端命令行中执行 npm i json-server2. 创建数据源 在项目中新建文件 db.json ,与 package.json 同级,内容为模拟的数据 注意 json 文件对格式…

选择步入式高低温试验室价格除外还需要考虑哪些方面?

选择步入式高低温试验室时,价格是一个非常重要的考虑因素。但是,步入式高低温试验室价格不仅仅是主要决定因素,我们还需要考虑到设备的性能、质量、可靠性以及售后服务等多方面因素。接下来给大家具体介绍的关于选择步入式高低温试验室价格除…

conan2 基础入门(06)-conanfile.py入门

conan2 基础入门(06)-conanfile.py入门 文章目录 conan2 基础入门(06)-conanfile.py入门⭐准备预备文件和Code ⭐使用流程指令 ⭐具体讲解conanfile.pyconan install END视频教学 ⭐准备 注意,如果想跟好的学习conanfile.py建议使用python来安装conan。 当然使用其…

C++入门系列-构造函数

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会…

Day 28 MySQL的数据备份与恢复

数据备份及恢复 1.概述 ​ 所有备份数据都应放在非数据库本地,而且建议有多份副本 备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方 冗余: 数据有多份冗余,但不等备份&…

JVM---垃圾回收

目录 一、C/C的内存管理 二、Java的内存管理 三、垃圾回收的对比 四、Java的内存管理和自动垃圾回收 五、方法区的回收 手动触发回收 六、堆回收 如何判断堆上的对象可以回收? 引用计数法 可达性分析算法 五种对象引用 软引用 软引用的使用场景-缓存 弱引用 虚…

机柜风扇KTS011温湿度控制器KTO011风机控制温控器机械开关温控仪

品牌:威驰 型号:KTS011常开 产地:中国大陆 颜色分类:KTS011常开,KTO011常闭 KTS011与KTO011的区别 KTS011,常开型,可搭配风扇/风机使用:当环境温度超过温控器设定温度,温控…

数据结构与算法===贪心算法

文章目录 定义适用场景柠檬水找零3.代码 小结 定义 还是先看下定义吧,如下: 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。 适用场景 由于…

Kafka的安装及接入SpringBoot

环境:windows、jdk1.8、springboot2 Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ 1.概述 Kafka 是一种高性能、分布式的消息队列系统,最初由 LinkedIn 公司开发,并于2011年成为 Apache 顶级项目…

C语言-课程管理系统-大作业

C语言编写课程管理系统 1 需求分析2 需要查的知识点3 数据结构和基础函数功能3.1 课程数据结构3.2 菜单和选择项3.3 从文件中加载课程信息到内存3.4 将内存中的课程信息保存到文件3.5 将输入的字符串格式化为课程信息结构体 4 主要功能函数4.1 录入课程信息函数4.2 浏览课程信息…

2024全新小狐狸AI免授权源码

源码安装说明: 下 载 地 址 : runruncode.com/php/19757.html 1. 在宝塔新建一个站点,选择 PHP 版本为 7.2、7.3 或 7.4。将压缩包上传到站点的根目录,并设置运行目录为 /public。 2. 导入数据库文件,该文件位于 …

Python装饰器带括号和不带括号的理解

装饰器是 Python 中一个强大且灵活的特性,允许用户在不修改原有函数或类定义的基础上,为其增加额外功能。 今天在尝试自定义 Python 装饰器的时候遇到了一个问题,因为以前一直是使用装饰器,基本没有自定义过装饰器,所…

vue3点击添加小狗图片,vue3拆分脚本

我悄悄蒙上你的眼睛 模板和样式 <template><div class"XueXi_Hooks"><img v-for"(dog, index) in dog1List" :src"dog" :key"index" /><button click"addDog1">点我添加狗1</button><hr …