2

考虑以下使用 lambda 的函数。

void printAll( const std::vector< std::string >& strings )
{
    auto fn = [] ( const std::string& s )
    {
        std::cout << s << std::endl;
    };

    std::for_each( strings.begin(), strings.end(), fn );
}

现在很清楚,如果完全启用内联,编译器将决定是否内联printAll()函数。(我将放弃关于它如何做出这个决定的脱轨讨论,关键字的存在与否是否inline与它有关,“整个程序”优化系统等等。)

我的问题是编译器如何处理是否内联的问题fn。可以:

  • 内联fn当且仅当它内联printAll()
  • 总是内联fn
  • 从不内联fn
  • 对 做出独立决定fn,本质上将其视为完全独立的功能?
  • 首先决定fn使用通常的启发式,然后printAll()根据是否内联来决定内fn联?

...或遵循其他一些政策?

这个答案是由 C++ 规范规定的,还是编译器实现者可以随意回答?

PS我知道std::for_each()将其函数参数作为模板参数,并且模板为内联问题带来了自己的复杂性。除非我弄错了,否则这个细节与问题无关,它与如何做出关于 lambda 和调用它们的函数的内联决策有关。请不要让它不必要地分散您的注意力。

4

1 回答 1

4

fn内联对inside的调用printAll的决定独立于内联的决定printAll。特别是,在所有编译器中fn被内联的可能性非常高,就像.代码,以及循环的存在)。std::for_eachprintAllfor_each

从选项列表中,最佳匹配是:

首先使用通常的启发式决定 fn,然后根据 fn 是否内联来决定内联 printAll()?

虽然内联缺少一个中间步骤,for_each但它本身对于启发式算法很重要。

请注意,标准中没有关于编译器会做什么的保证,所以如果你真的很在意,请查看生成的汇编器

于 2013-07-16T20:04:55.610 回答