【问题标题】:Is it possible for JIT inlining to inline my code into some .NET runtime assembly code?JIT 内联是否可以将我的代码内联到一些 .NET 运行时汇编代码中?
【发布时间】:2012-10-01 21:02:07
【问题描述】:

我想了解 JIT 内联有多普遍。

假设在我的代码中,我从 System.IO 程序集中调用某个函数,并将回调引用传递给在我的代码中实现的函数,以便从该 System.IO 函数内部调用。在我的函数中有GetCallingAssembly() 调用。因此,如果我的回调被内联到 System.IO 中,则对 GetCallingAssembly() 的调用最初在我的代码中,并且打算说“当前”方法是从内部调用的 System.IO 会说它现在是从我的代码内部调用的.

这种内联是可能的,还是 .NET 运行时程序集的处理方式不同,因此不允许将用户代码 JIT 内联到 .NET 运行时代码中?

【问题讨论】:

  • 委托回调如何内联到回调调用者?我不确定这是否有意义......?我的理解是内联仅限于要调用的代码是可证明的场景 - 即静态调用或对非虚拟方法的虚拟调用。
  • @Mark Gravel:如果知道这是整个程序中回调调用者的唯一调用,为什么不能呢?
  • 怀疑这比 JIT 更加努力理解,特别是因为反射/元编程存在(意思是:新的调用者可能会在以后出现)
  • 你能选择一个更奇怪的例子来作为一个程序集吗?我要说它不存在 - 然后我发现它确实存在于 v4.0 下,但据我所知,它纯粹将类型转发回 mscorlib - 到目前为止据我所知,这些类型一直存在于 mscorlib 中。嗯。

标签: c# .net reflection jit


【解决方案1】:

您可以放心地假设回调不会被内联。 .NET Framework 程序集总是在安装时由 ngen.exe 预先设置,之后无法更改该代码。此外,即使抖动优化器可以推断出委托的目标方法可能是什么,通过委托的回调也永远不会内联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2012-06-16
    • 2015-03-17
    相关资源
    最近更新 更多