【发布时间】:2021-12-23 10:00:02
【问题描述】:
根据docs,单位Vector3 是值类型。
还根据docs“默认情况下,在赋值时,将参数传递给方法,并返回方法结果,复制变量值。在值类型变量的情况下,复制相应的类型实例”。
不是性能、指针等方面的专家,但我认为通过引用而不是值来传递参数以避免复制实例的事实是关于性能的一个好习惯。这就是为什么 c# 中的大多数类型都是引用类型的原因。
RaycastHit 结构也是如此。
据我研究,类和结构有以下基本区别
- 类是引用类型,结构是值类型
- 结构不支持继承
- 结构不能有默认构造函数
对于我来说,这一切都不能证明放弃 ref 类型的性能优势是合理的,所以,主要是 Vector3 在任何游戏中都会有向量作为参数传递,所以在整个应用程序中复制,原因是什么它是结构类型的吗?
【问题讨论】:
-
您错过了引用类型的 成本,尤其是 GC 为再次释放该内存而增加的工作量,这对延迟敏感很重要游戏之类的东西。复制几个字节实际上是免费的:guidelines 将限制设置为 16 个字节。对于较大的结构,有一些机制可以传递对它们的引用:
ref和out一直存在,但in和readonly结构是为 Unity 之类的东西引入的 -
@canton7 没有一个 Unity 结构是只读的;)
-
@derHugo 他们仍然被引入对延迟敏感的应用程序,例如 Unity
-
另一个缺失的区别是heap vs stack allocation