对预制类和基本类型C#进行配对的最佳方法

时间:2016-01-28 06:59:18

标签: c# class struct monogame

基本上,我想要使用预制类(RenderTarget2D,如果你必须知道)有效地将多个bool和字节(存储值)配对。

显然,我可以将这一切都包含在一个类中,但是有些情况下我将拥有其中的许多内容,并希望尽可能节省内存(即使用结构)。

我知道使用带有引用变量的结构是不好的行为,我宁愿不使用单独的变量来保存信息(宁愿将它们全部配对)。

本质上我想要一个结构来保存对类,bool和一个字节的引用,并创建一个这样的2D数组来生成许多(因此我正在寻找缓解内存使用)

我是否忽视了一个明显的解决方案?

1 个答案:

答案 0 :(得分:2)

将问题理解为:

你想要的东西包含{​​{1}},bool和类byte的实例。

如果是这种情况,您可以使用RenderTarget2D

创建自定义类或结构也是一种可行的选择。实际上有一个提议#C; 7#"包括本地语言tuples(不会是System.Tuple),并且按照当前编写的方式,它们将是结构。

您可能还需要考虑引用Tuple<bool, byte, RenderTarget2d>可能会延长其使用寿命。

结构与类

结构在内存中(压缩时)占用RenderTarget2d的大小加上bool的大小加上引用的大小(到byte)。如果你有一个600乘600(360000)这样的结构数组,它需要360000个内存中结构的大小。

如果使用类,则数组将具有360000个对数据实际位置的引用,这些引用总是至少与结构数组一样多。

所以使用结构应该占用更少的内存......

但是从数据结构中获取结构时,实际上是在制作副本。因此,每次访问数组以获取项目并读取该项目的属性时,您实际上是在制作项目的副本并从该副本中读取属性。

如果你想更新它,你需要阅读它(如上所述制作副本)编辑它,然后把它放回去......然后将数据复制到数组中。

所以,如果记忆是主要关注点。使用struct。引用Jon Skeet:&#34;只要你知道后果&#34;。

使用struct也意味着更少的RAM往返。不仅因为它避免了解析引用,还因为数据保证靠近在一起。这样可以获得更好的性能,因为CPU会在缓存中加载数据结构的一个块(或整体),因为代码不使用外部的引用,它可以将它保存在缓存中而不是加载另一个东西