结构的最佳解决方案,超过16个字节

时间:2009-01-04 07:32:04

标签: c# optimization class struct

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

  • 表示单值
  • 这是不可改变的

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

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

  1. 继续使用struct?
  2. 换班?
  3. 或将6个整数打包成int数组,因此它只有一个字段
  4. 修改

    具有6个整数字段的struct的大小是24个字节,这是很难传递的。 struct的推荐大小不超过16个字节

7 个答案:

答案 0 :(得分:5)

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

  1. 你打算分配很多东西而不是把它分开吗?
  2. 是否会被第三方代码消费?在这种情况下,类通常会为您提供更大的灵活性。
  3. 你想要结构与类的语义吗?例如,不可为空?
  4. 您是否可以从此类的一些预先创建的实例中获益,这些实例可以重复用于表示特殊情况?与String.Empty类似。在这种情况下,您将从课程中受益。
  5. 很难回答您在问题中提供的信息。

答案 1 :(得分:1)

小心拳击。如果您的结构将由需要Object的方法使用,它将被强制转换为对象,并且您将有潜在的性能损失。

这是一个reference,可以更详细地解释它。

我会把它变成一个班级(#2)然后你就不用担心了。

使用六个整数数组(#3)可能会使您的代码更难阅读。每个int都有一个具有描述性标识符的类会好得多。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

WriteOnce<int[]>怎么样?

答案 4 :(得分:0)

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

(我假设你关注的是表现。)

答案 5 :(得分:0)

如果数据持有者将是不可变的,那么struct-versus-class问题很可能取决于每个实例存在的平均引用数。如果有一个TwentyFourByteStruct [1000]数组,那么该数组将占用24,000个字节,无论每个元素是否包含不同的值,所有元素都保持相同的值,或者介于两者之间。如果有一个TwentyFourByteClass [1000]数组,那么该数组将占用4,000或8,000个字节(对于32/64位系统),并且创建的每个不同的TwentyFourByteClass实例将占用大约48个字节。如果所有数组元素碰巧都包含对同一TwentyFourByteClass对象的引用,则总数将为4,048或8,048字节。如果所有数组元素都持有对不同TwentyFourByteClass对象的引用,则总数将为52,000或56,000字节。

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

答案 6 :(得分:-1)

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