【问题标题】:Is it possible to C++ compiler inline method calls across DLLs?是否可以跨 DLL 进行 C++ 编译器内联方法调用?
【发布时间】:2010-12-14 05:59:08
【问题描述】:

是否可以跨 DLL 进行 C++ 编译器内联方法调用? .NET JIT 有可能吗?

【问题讨论】:

  • 对于 C++:当然不是。你怎么能内联你不拥有的东西?
  • @ruslik:您不需要源代码来“拥有”该功能。您只需要知道要内联目标文件的哪一部分,编译器可以将其存储在文件中。
  • @Jorgen:要么它在 DLL 中,所以它可以独立于其余代码进行更新,要么你明确地内联它,所以它不再在 DLL 中。

标签: .net c++ compiler-construction jit


【解决方案1】:

对于 .NET 抖动来说,这是肯定的。它只是从 DLL 加载 IL,即时代码生成使得它来自 DLL 的事实消失了。来自任何 DLL 的所有代码都进入同一个加载程序堆。这样做的一个后果是,除非卸载整个 AppDomain,否则无法卸载 DLL。

对于 C++ 编译器,绝对否,导出的函数是预编译的,并且位于一个固定地址,与 DLL 基地址有一个偏移量。尽管可以进行优化,但需要通过 IAT 进行间接跳转。但不是内联,必须由编译器完成。

【讨论】:

  • JIT 是可能的。我不知道.NET 是否这样做。 .NET 将为 EXE 和 DLL 缓存已编译的机器代码,如果为每次运行重新编译自定义版本,该缓存将毫无用处。
【解决方案2】:

如果您没有包含“.net”标签,那么答案将是 NO。但是,使用“.net”标签,抖动应该能够至少优化,如果不是内联,除非该DLL是您P/的本机代码DLL调用反对。

【讨论】:

    【解决方案3】:

    一个完全定义在C++头文件中的函数在正常情况下必须被编译器内联,因为没有为该函数分配编译单元。当然,可以说该函数甚至不属于 DLL,因为您不会在那里找到该函数的入口点,但恕我直言,这只是挑剔者的观点。

    【讨论】:

      【解决方案4】:

      您应该检查编译器的/GL (Whole Program Optimization) 标志。

      此标志告诉链接器跨模块边界进行优化,包括函数内联。

      【讨论】:

      • 澄清一下:/GL 不适用于本地的跨 DLL 调用。
      • 对。它只是帮助您组织代码。如果没有它,您将不得不将大多数函数放在头文件或单个巨大的 .cpp 文件中(以使大部分内联受益)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多