基本上,我想要使用预制类(RenderTarget2D,如果你必须知道)有效地将多个bool和字节(存储值)配对。
显然,我可以将这一切都包含在一个类中,但是有些情况下我将拥有其中的许多内容,并希望尽可能节省内存(即使用结构)。
我知道使用带有引用变量的结构是不好的行为,我宁愿不使用单独的变量来保存信息(宁愿将它们全部配对)。
本质上我想要一个结构来保存对类,bool和一个字节的引用,并创建一个这样的2D数组来生成许多(因此我正在寻找缓解内存使用)
我是否忽视了一个明显的解决方案?
答案 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会在缓存中加载数据结构的一个块(或整体),因为代码不使用外部的引用,它可以将它保存在缓存中而不是加载另一个东西