【问题标题】:what does this attribute do: MethodImplOptions.NoInlining (or: what is 'inlining' a method) [duplicate]这个属性有什么作用:MethodImplOptions.NoInlining(或:什么是“内联”方法)[重复]
【发布时间】:2012-03-24 22:48:49
【问题描述】:

可能重复:
Inline functions in C#?
What is method inlining?

我一直在调试代码,问题的“可能”根源在于标有此代码的函数:

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
protected virtual void PropertyHasChanged()

读MSDN是这么说的:指定方法不能内联。

但是什么是“内联”方法?

编辑:

澄清:PropertyHasChanged() 方法在每个属性的 SET 方法中调用,并更新(向其添加 1)内部对象计数器。当该计数器 > 0 时,对象被标记为“脏”,并在调用 Save 时保存到数据库中。当 counter = 0 时,对象不会被保存到数据库中。现在我知道这段代码有时不会被执行(计数器不会增加),所以对象不会被保存到数据库中,

【问题讨论】:

  • 请注意,虽然这是一个有效的问题,但这种方法的内联与否几乎肯定与您正在调试的任何问题无关。
  • @Veger:我读过那篇文章,但它主要是关于 C# 中的内联方法,而不是它的含义......
  • (我的欺骗候选人不是 C# 特定的,但确实解释了内联实际上是什么)
  • 投票率最高的答案指出:“内联方法只是一种编译器优化,其中函数的代码被滚动到调用者中。”其中(非常简要地)描述了方法代码直接放入调用上下文中(而不是创建实际方法)。那就是内联。
  • 这就像一场经典的穿线比赛。是的,内联会影响这样的错误。

标签: c#


【解决方案1】:

内联一个方法/属性意味着编译器接受它并用它的内容替换对它的调用(确保正确的变量等)。这不是 C# 特有的。

这样做是为了正常的性能。

例如,用这个方法和调用:

private long Add(int x, int y)
{
   return x + y;
}

var z = Add(x, y);

编译器可能会将其内联为(消除过程中的方法):

var z = x + y;

维基百科文章Inline expansion开头是:

在计算中,内联扩展或内联是一种手动或编译器优化,它将函数调用站点替换为被调用者的主体。这种优化可能会提高运行时的时间和空间使用率,但可能会增加程序的最终大小(即二进制文件大小)。

【讨论】:

  • 非常感谢您的清晰解释!
  • 为了清楚起见 - C# 编译器将从不内联方法。这是 JITter 的任务。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2018-01-28
  • 2011-10-09
  • 2013-02-04
  • 1970-01-01
  • 2018-09-04
  • 2019-01-27
  • 1970-01-01
相关资源
最近更新 更多