【问题标题】:Optimal solution for struct with more than 16 bytes超过 16 字节的结构的最佳解决方案
【发布时间】:2010-09-29 11:08:44
【问题描述】:

我有一个类型,我认为将其用作结构。

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

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

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

  1. 继续使用结构?
  2. 改班?
  3. 或者将 6 个整数打包成一个 int 数组,所以它只有一个字段

编辑

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

【问题讨论】:

  • 能否提供一些额外的细节。
  • 如果您可以在问题中包含为什么 int 的 6 个字段是一个问题,这将对未来的读者很有用。也许这是 C# 用户的常识,但对我来说并不明显。
  • @Software Monkey:它是一个三角形。字段为sideA、sideB、sideC、size、seed1、seed2。
  • @slim:谢谢。我已经编辑了我的问题。
  • 请原谅我的 C 背景和缺乏 C# 知识,但这不是您通过引用传递的答案吗?

标签: c# optimization class struct


【解决方案1】:

如果数据持有者是不可变的,那么结构与类的问题很可能取决于每个实例存在的平均引用数。如果有一个 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 字节还是16,000 字节。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      一般来说,当存储多于两条相关数据时,我喜欢创建一个将它们绑定在一起的类。特别是如果我将它们作为一个整体传递。

      【讨论】:

      • 我认为你错过了问题的重点——这不是是否将它们放在一起的问题,而是使用结构还是类。
      【解决方案4】:

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

      这里有一个reference 更详细地解释了它。

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

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

      【讨论】:

        【解决方案5】:

        这取决于你打算如何使用它?

        1. 您是要分配很多,还是要大量传递?
        2. 它会被第 3 方代码使用吗?在这种情况下,类通常会为您提供更大的灵活性。
        3. 您想要结构与类语义吗?例如,不可为空?
        4. 拥有几个可重复用于表示特殊情况的此类预创建实例是否对您有益?类似于 String.Empty。在这种情况下,您将从课程中受益。

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

        【讨论】:

        • 1.传递很多 2. 不会​​被 3rd 方代码使用 3. 不 4. 不
        • 在我看来,上课可能是您的正确选择。这主要基于您对问题 #1 和 #3 的回答。
        【解决方案6】:

        WriteOnce<int[]> 怎么样?

        【讨论】:

        • @Dmitri Nesteruk:你能解释一下吗?
        【解决方案7】:

        没有看到你的结构,很难明确地说出什么。但我怀疑您应该将其保留为结构。

        【讨论】:

          猜你喜欢
          • 2013-05-03
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 2016-11-08
          • 1970-01-01
          • 2020-04-12
          • 1970-01-01
          • 2010-11-05
          相关资源
          最近更新 更多