【问题标题】:In practice, will a C# struct with a single member be as efficient as using that single member outside of a struct?在实践中,具有单个成员的 C# 结构是否与在结构外部使用该单个成员一样有效?
【发布时间】:2017-07-05 12:09:13
【问题描述】:

我正在开发一个库,它在内部传递整数值,这些整数值不是真正的整数,而是方便的位容器。

为了我自己的理智,我宁愿这样做......

internal struct MyStruct
{
    private readonly int myInt;
    /* Constructor and get accessors. */
}

... 并传递 MyStruct 值而不是 int 值。这样我就可以使用我很好的 get 访问器,编译器会阻止我使用错误的类型。

我是否可以合理地确定这样做没有导致效率低下?感觉就像一旦编译器完成了它的工作,MyStruct 的所有使用都应该归结为一个简单的 int,就像 int 一样占用一个寄存器。

我的经验告诉我,单个成员结构确实可以按照我希望的方式编译,但我很难将其归结为除了直觉之外的任何东西。

【问题讨论】:

  • 不太清楚为什么在这里需要一个结构,为什么不直接传递 int 呢?
  • @DavidG 键入安全且方便的获取访问器。 myvalue.Flarn 与 GetFlarn(myvalue)
  • 好吧,通过查看它的编译版本(在发布版本中),我可以告诉你 Stuct 不会被编译掉......它仍然是一个带有 int 字段的结构.
  • @gregkalapos 你在看 CIL/MSIL 还是机器码?
  • 您也可以使用扩展方法添加get 方法。

标签: c# optimization struct


【解决方案1】:

这只是答案的一半:我相信你是正确的,因为 struct 成员只是 struct 本身的一部分,因此传递的方式与 int 相同,因为 struct 和 int 具有相同的大小(虽然我无法从语言规范中找到明确的答案)。

但是,将您的会员设置为只读会带来惊人的性能损失。请参阅 John Skeet 在https://codeblog.jonskeet.uk/2014/07/16/micro-optimization-the-surprising-inefficiency-of-readonly-fields/

的解释

因此,我会让你的成员成为非只读的,只是不为它创建任何修改器。

【讨论】:

  • C# 规范和 CIL 规范都没有要求具有单个 int 成员的 struct 具有特定大小。值类型的大小取决于实现并且允许填充。这是故意的,以增加可移植性。 (实际上,它们的大小相同,而且它们肯定在 .NET Framework 上。)您可以通过显式指示布局 (StructLayoutAttribute) 来覆盖它,尽管这对单个成员当然没什么兴趣结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2016-08-12
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多