Closed. This question is opinion-based。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
                        
                        3年前关闭。
                                                                                            
                
        
基本上,我想将多个布尔值和字节(以存储值)与预制类(如果必须知道,则为RenderTarget2D)有效地配对。

显然,我可以将所有这些包装在一个类中,但是在某些情况下,我将拥有许多此类包装,并且希望在可能的情况下节省内存(即使用结构)。

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

本质上,我想要一个结构来保存对类,布尔值和字节的引用,并为此创建一个2D数组以构成许多对象(因此正在寻找减少内存使用的方式)

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

最佳答案

将问题理解为:

您需要一个包含boolbyte和类RenderTarget2D的实例的东西。

在这种情况下,您可以使用Tuple<bool, byte, RenderTarget2d>

创建自定义类或结构也是可行的选择。实际上,有人建议“ C#7”包括本机语言tuples(不会是System.Tuple),并且如当前所写,它们将是结构。



您可能还想考虑引用RenderTarget2d可以延长其寿命。



结构与类

该结构在内存中(压缩时)占用bool的大小加上byte的大小加上引用的大小(到RenderTarget2d)。如果您有600 x 600(360000)这样的结构的数组,则它将占用内存中该结构的大小360000。

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

因此,使用结构应该占用更少的内存...

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

如果要更新它,则需要对其进行读取(按上述方式进行复制)进行编辑,然后再放回去……然后将数据复制到阵列中。

因此,如果内存是主要问题。使用结构。引用乔恩·斯基特的话:“只要您知道后果”。



使用struct还意味着更少的RAM往返。不仅因为它避免了解析引用,而且还因为保证了数据相互靠近。由于CPU将在缓存中加载数据结构的一部分(或全部),并且由于代码未使用外部引用,因此它可以将其保留在缓存中而不用加载其他内容,从而提高性能。 。

10-05 18:46