假设我有两个功能:
void foo() {
// A big function
}
// This is a wrapper to foo
inline void bar() {
// couple of lines -- simple ones. I promise!
foo();
}
我知道编译器是最终决定是否内联函数的编译器。我想知道的是当涉及到包装器(调用其他函数)时,编译器进行分析的深度是多少?
是否会在bar()
内停止,只是复制调用bar()
的任何内容,或者是否也会查看foo()
?如果foo()
位于动态链接到bar()
的预编译库中,会有什么不同?
答案 0 :(得分:3)
唯一可以确定的方法是检查反汇编。
总的来说,我从不担心这种微优化,因为我相信编译器能够在内联决策中做出正确的选择。只有当分析显示函数调用导致显着的开销时,我才会尝试更改编译器的选择。
答案 1 :(得分:1)
如果所有内容都在同一个翻译单元中且启用了优化,则可能会内联,但很可能取决于编译器的代码分析和优化设置。你不能指望它(或避免它)。
如果foo()
位于自己的翻译单元(甚至是自己的库)中,则不会内联(因为这是不可能的)。诸如“链接时间代码优化”之类的内容(例如,在MSVC中可用)可能会尝试在不同的翻译单元上内联代码,但它无法内联动态库中的代码。