考虑以下使用 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 和调用它们的函数的内联决策有关。请不要让它不必要地分散您的注意力。