C++ 编译器是否可以跨 DLL 进行内联方法调用? .NET JIT 可能吗?
对于 .NET 抖动来说,这是肯定的。 它只是从 DLL 加载 IL,即时代码生成使得它来自 DLL 的事实消失了。 任何 DLL 中的所有代码都进入同一个加载程序堆。 这样做的后果之一是除非卸载整个 AppDomain,否则无法卸载 DLL。
对于 C++ 编译器来说肯定不行,导出的函数是预编译的并且位于固定地址,即相对于 DLL 基地址的偏移量。 尽管可以进行优化,但仍需要通过 IAT 进行间接跳转。 但不是内联,这必须由编译器完成。
如果您没有包含“.net”标签,那么答案将是NO。然而,使用“.net”标签,抖动应该至少能够优化,如果不是内联,除非DLL是您P/Invoke针对的本机代码DLL。
完全在C++头文件中定义的函数,一般情况下必须由编译器内联,因为该函数没有分配编译单元。当然,有人可能会说该函数甚至不属于 DLL,因为您在那里找不到该函数的入口点,但恕我直言,这只是挑剔者的观点。
您应该检查编译器的 /GL(整个程序优化) 标志。
此标志告诉链接器跨模块边界进行优化,包括函数内联。