g ++是否内联了以下功能?

时间:2012-03-16 19:09:22

标签: c++ inline

假设我有两个功能:

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()的预编译库中,会有什么不同?

2 个答案:

答案 0 :(得分:3)

唯一可以确定的方法是检查反汇编。

总的来说,我从不担心这种微优化,因为我相信编译器能够在内联决策中做出正确的选择。只有当分析显示函数调用导致显着的开销时,我才会尝试更改编译器的选择。

答案 1 :(得分:1)

如果所有内容都在同一个翻译单元中且启用了优化,则可能会内联,但很可能取决于编译器的代码分析和优化设置。你不能指望它(或避免它)。

如果foo()位于自己的翻译单元(甚至是自己的库)中,则不会内联(因为这是不可能的)。诸如“链接时间代码优化”之类的内容(例如,在MSVC中可用)可能会尝试在不同的翻译单元上内联代码,但它无法内联动态库中的代码。