2009-01-04 103 views
3

我有一个类型,我认为使用它作为结构。超过16个字节的结构的最佳解决方案

  • 它代表单个值
  • 它是不可变的

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

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

  1. 保持使用结构?
  2. 更改为类?
  3. 或包6点的整数转换成int的阵列,所以它只有一个字段

EDIT

与6的整数字段结构的大小为24个字节,这是巨大的以绕过。 struct的推荐大小不超过16字节

+0

请您提供一些额外的细节。 – 2009-01-04 07:58:14

+0

如果你可以在问题中包含为什么6个int域是一个问题,这将对未来的读者有用。也许这是C#用户的常识,但对我来说并不明显。 – slim 2009-01-04 09:13:11

+0

@软件猴:这是一个三角形。字段是sideA,sideB,sideC,size,seed1,seed2。 – 2009-01-04 10:29:39

回答

5

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

  1. 你打算分配很多它与传递它很多吗?
  2. 它会被第三方代码使用吗?在这种情况下,班级通常会给你更多的灵活性。
  3. 你想结构与类的语义?例如,不可空?
  4. 您是否可以从这个类的预创建实例中受益,这个实例可以被重用来表示特殊情况?类似于String.Empty。在这种情况下,你会从一堂课中受益。

仅仅根据您在问题中提供的信息很难回答。

0

没有看到你的结构,很难说明确任何事情。但我怀疑你应该把它作为一个结构。

0

WriteOnce<int[]>怎么样?

1

小心拳击。如果你的结构将被一个期望Object的方法所使用,它将被强制转换为一个对象,并且你将会有潜在的性能影响。

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

我想让它成为一个类(#2),然后你就不必担心它。

使用一个由6个整数组成的数组(#3)可能会让你的代码难以阅读。每个int都带有描述性标识符的类会更好。

-1

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

0

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

(我假设你的关心这里是性能。)

0

如果数据持有人将是不可改变的,该结构抗类的问题将很可能取决于平均引用数那会存在于每个实例。如果有一个TwentyFourByteStruct [1000]数组,那么该数组将占用24,000个字节,而不管每个元素是否包含不同的值,所有元素都保持相同的值,或者位于中间的某个位置。如果有一个TwentyFourByteClass [1000]数组,那么该数组将需要4,000或8,000个字节(对于32/64位系统),并且每个创建的TwentyFourByteClass实例将需要大约48个字节。如果所有的数组元素碰巧持有对同一TwentyFourByteClass对象的引用,则总数将是4,048或8,048字节。如果所有数组元素都持有对不同TwentyFyByteClass对象的引用,则总数将为52,000或56,000字节。

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