可变结构?我不确定是使用可变结构还是可变类。我的程序存储了一个包含大量对象的数组。我注意到使用类会使所需的内存量增加一倍。但是,我希望对象是可变的,而且有人告诉我使用可变结构是邪恶的。这是我的类型:struct/*orclass*/Block{publicbyteID;公共布尔HasMetaData;//不确定HasMetaData==false还是//MetaData==null更快,可能会删除这个publicBlockMetaDataMetaData;//BlockMetaData始终是类引用}像这样分配大量对象(注意下面的两个代码都运行了81次)://structBlock[,,]blocks=newBlock[16,256,16];执行此操作时使用大约35MiB的内存://classBlock[,,]blocks=newBlock[16,256,16];for(intz=0;z<16;z++)for(inty=0;y<256;y++)for(intx=0;x<16;x++)blocks[x,y,z]=newBlock();使用大约100MiB的内存。总而言之,我的问题如下:我应该为块类型使用结构还是类?实例应该是可变的,并存储一些值和一个对象引用。首先,如果你真的想节省内存,那就不要使用结构或类。byte[,,]blockTypes=newbyte[16,256,16];BlockMetaData[,,]blockMetadata=newBlockMetaData[16,256,16];你想在内存中将这样的东西紧紧地打包在一起。如果可以避免,就永远不想在结构中的引用旁边放置一个字节;这样的结构会自动浪费三到七个字节。在.NET中引用必须是字对齐的。其次,我假设您正在此处构建体素系统。根据它们的分布,可能有比3D阵列更好的表示体素的方法。如果您要制作大量这些东西,请将它们存储在不可变的八叉树中。通过使用不可变八叉树的持久属性,您可以制作具有四十个体素的立方体结构,只要您代表的宇宙是“块状的”。也就是说,全世界都有很大的相似区域。您可以在更长的O(lgn)时间内访问和更改元素,但您可以使用更多元素。第三,“ID”是一种非常糟糕的表示“类型”概念的方式。当我看到“ID”时,我假设该数字唯一标识该元素,而不是描述它。考虑将名称更改为不那么令人困惑的名称。第四,有多少元素有元数据?如果具有元数据的元素数量与元素总数相比较小,则可能比引用数组更好。考虑一种稀疏数组方法;稀疏数组更节省空间。它们真的必须是可变的吗?您始终可以使用不可变结构为不同的字段创建新值:structBlock{//我肯定会摆脱HasMetaDataprivatereadonlybyteid;私有只读BlockMetaData元数据;publicBlock(byteid,BlockMetaDatametaData){this.id=id;this.metaData=metaData;}publicbyteId{get{返回id;}}publicBlockMetaDataMetaData{get{returnmetaData;}}publicBlockWithId(bytenewId){returnnewBlock(newId,metaData);}publicBlockWithMetaData(BlockMetaDatanewMetaData){returnnewBlock(id,newMetaData);老实说,我仍然不确定我是否会把它变成一个结构体——但我对此表示怀疑,无论如何我都试图将它变成一个结构体。您在内存和速度方面的性能要求是什么?不可变类与这些要求有多接近?结构数组将提供比对具有相同字段的不同类实例的不可变引用数组更好的存储效率,因为后者将需要前者所需的所有内存,除了管理类实例的内存和保存所需的内存参考。总而言之,您设计的结构布局效率非常低。如果你真的关心空间,并且每个项目实际上需要独立存储一个字节,一个布尔值和一个类引用,你最好的选择是要么有两个字节数组(一个字节实际上小于一个布尔值))和一个数组类引用,或者有一个字节数组,一个1/32元素的数组,如BitVector32,和一个类引用数组。以上就是C#学习教程:变量结构与类?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
