【问题标题】:Is it possible that code of method from a referenced dll gets inlined in my own code?是否有可能来自引用的 dll 的方法代码被内联到我自己的代码中?
【发布时间】:2011-02-28 19:33:46
【问题描述】:

不久前,我读过一些关于“内联”的内容。 .Net 编译器将从小方法中注入代码(内联)以加快执行速度。

是否有可能来自引用的 dll 的方法代码被内联到我自己的代码中?

【问题讨论】:

    标签: c# .net inlining


    【解决方案1】:

    是的,这是可能的,在 JITting 时。

    不是在编译时。

    这意味着您的程序集将只包含您编写时使用的代码,但是当它在运行时被 JIT 转换为本机机器代码时,JIT 编译器可能会将其他程序集中的小方法内联到您自己的代码中。

    【讨论】:

    • 这是正确的,因为在编译过程中不会发生内联,只会发生抖动。
    • 而在乔纳森艾伦在他的回答中谈到的ngen.exe编译的情况下?
    【解决方案2】:

    是的。如果您不使用 ngen.exe 预编译程序集,则 JIT 编译器可以自动跨程序集内联。

    【讨论】:

    • 你能详细说明一下吗?我对 ngen.exe 不熟悉。
    • C# 被编译为 IL 代码。 JIT 或即时编译器在用户计算机上运行时将其转换为机器代码。有时您想更早地将其转换为机器代码。为此,您使用程序调用 ngen 或“本机图像生成器”。
    【解决方案3】:

    准确地说,没有。

    但如果 DLL 的 Lib 可用(DLL 代表动态链接库,我们无法静态链接)它可能会发生。

    自动内联作为优化的一个步骤,只在小函数或很少使用的函数上执行,但总是在库上。

    总而言之,静态链接库(Windows 中的 *.lib 或 Unix 中的 .a)可以复制到您的程序中,但动态链接库(Windows 中的.dll 或 Unix 中的 *.so UNIX) 不能。

    如果是 .NET 或类似框架,情况会有所不同。

    【讨论】:

    • 这个问题被标记为“c#”和“.net”,所以我认为可以安全地假设 Kees 正在询问 .NET。
    • 是的...这是关于 .Net dll 的。尽管如此,这个观察虽然偏离了主题,但却是一个很好的观察。
    【解决方案4】:

    它通常很有可能。 但你不能自己决定,它的编译器决定:

    检查:http://www.ademiller.com/blogs/tech/2008/08/c-inline-methods-and-optimization/

    【讨论】:

    • 给定的链接讨论的是一个二进制文件中的类,而不是引用的 DLL 中的类,对吧?
    • 这是对的,但特别是因为它是 JIT 编译器,我的理解应该同样发生
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2020-01-09
    • 2020-08-29
    • 1970-01-01
    相关资源
    最近更新 更多