c# – 可变结构与类?

c# – 可变结构与类?,第1张

概述我不确定是使用可变结构还是可变类. 我的程序存储了一个包含大量对象的数组. 我注意到使用类会使所需的内存量翻倍.但是,我希望这些对象是可变的,并且我被告知使用可变结构是邪恶的. 这就是我的类型: struct /* or class */ Block{ public byte ID; public bool HasMetaData; // not sure whether Has 我不确定是使用可变结构还是可变类.
我的程序存储了一个包含大量对象的数组.
我注意到使用类会使所需的内存量翻倍.但是,我希望这些对象是可变的,并且我被告知使用可变结构是邪恶的.
这就是我的类型:

struct /* or class */ Block{    public byte ID;    public bool HasMetaData; // not sure whether HasMetaData == false or                             // MetaData == null is faster,might remove this    public BlockMetaData MetaData; // BlockMetaData is always a class reference}

像这样分配大量的对象(注意下面的两个代码都运行了81次):

// structBlock[,] blocks = new Block[16,256,16];

使用大约35 MiB的内存,同时这样做:

// classBlock[,16];for (int z = 0; z < 16; z++)for (int y = 0; y < 256; y++)for (int x = 0; x < 16; x++)    blocks[x,y,z] = new Block();

使用大约100 MiB的ram.

总而言之,我的问题如下:

我应该为块类型使用结构或类吗?实例应该是可变的并存储一些值加上一个对象引用.

解决方法 首先,如果你真的想节省内存,那么不要使用结构或类.

byte[,] blockTypes = new byte[16,16]; BlockMetaData[,] blockMetadata = new BlockMetaData[16,16];

你想在内存中将类似的东西紧紧包装在一起.如果你可以避免它,你永远不想在结构中的引用旁边放一个字节;这样的结构会自动浪费三到七个字节.引用必须在.NET中进行字对齐.

其次,我假设你在这里建造一个体素系统.根据它们的分布,可能有更好的方式来表示体素而不是三维阵列.如果你要制作真正大量的这些东西,那么将它们存储在一个不可变的八叉树中.通过使用不可变八叉树的持久性属性,只要您所代表的宇宙是“块状”,您就可以在其中制作具有数十亿个体素的立方结构.也就是说,世界上存在大的相似区域.你可以用更大的O(lg n)时间来访问和更改元素,但是你可以使用更多的元素.

第三,“ID”是表示“类型”概念的一种非常糟糕的方式.当我看到“ID”时,我假设该数字唯一地标识该元素,而不是描述它.考虑将名称更改为不那么令人困惑的东西.

第四,有多少元素有元数据?如果具有元数据的元素数量与元素总数相比较小,则可能比引用数组更好.考虑一种稀疏数组方法;稀疏数组的空间效率更高.

总结

以上是内存溢出为你收集整理的c# – 可变结构与类?全部内容,希望文章能够帮你解决c# – 可变结构与类?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1225125.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存