关于c#:结构的最佳解决方案,超过16个字节

Optimal solution for struct with more than 16 bytes

我有一个我认为用作结构的类型。

  • 它表示单个值
  • 它是不可变的。

但问题是,它有6个int字段。

那么我应该为这种类型使用哪种解决方案呢?

  • 继续使用结构?
  • 改上课?
  • 或者将6个整数打包成一个int数组,这样它只有一个字段
  • 编辑

    带有6个整型字段的结构的大小为24字节,这对于传递来说是巨大的。建议结构大小不超过16字节


    这取决于你将如何使用它?

  • 你会分配很多信息还是传递很多信息?
  • 它会被第三方代码消耗吗?在这种情况下,类通常会给您更多的灵活性。
  • 你想要结构和类语义吗?例如,不可以为空?
  • 您会从这个类的几个预先创建的实例中获益吗,这些实例可以重用来表示特殊的情况?类似于string.empty。在这种情况下,你会从课堂中受益。
  • 仅仅从你在问题中提供的信息就很难回答。


    小心拳击。如果您的结构将被一个需要对象的方法使用,那么它将被强制转换为一个对象,并且您可能会受到性能影响。

    这里有一个更详细的参考资料。

    我会让它成为一个班级(2),然后你就不用担心了。

    使用六个整数(3)的数组可能会使代码更难读取。对于每个int使用描述性标识符的类会更好。


    如果数据持有者是不可变的,那么结构与类的问题很可能取决于每个实例存在的平均引用数。如果一个数组有twentyfourbytestruct[1000],那么该数组将占用24000字节,不管每个元素是否具有不同的值,所有元素都具有相同的值,或者介于两者之间。如果一个数组有twentyFourByteClass[1000],该数组将占用4000或8000字节(对于32/64位系统),创建的twentyFourByteClass的每个不同实例将占用大约48字节。如果所有数组元素恰好包含对同一个twentyFourByteClass对象的引用,那么总计将为4048或8048字节。如果所有数组元素都包含对不同的twentyFourByteClass对象的引用,那么总计将为52000或56000字节。

    至于运行时性能,您可以得到的最佳性能通常是通过引用传递结构。按值传递结构将需要复制它们,这对于大于16字节的结构(NET包括对16字节或更小的结构的优化)可能会很昂贵,但按引用传递值类型的成本与1字节或16000字节的成本相同。


    我建议写一个小基准来衡量不同选择的表现,这是唯一确定的方法。你可能会对结果感到惊讶(我经常这样)。

    (我假设您关心的是性能。)


    一辆WriteOnce怎么样?


    如果没有看到你的结构,就很难明确地说出任何东西。但我怀疑你应该把它作为一个结构。


    通常,当存储两个以上的相关数据时,我喜欢创建一个将它们绑定在一起的类。尤其是当我将他们作为一个整体传递的时候。