【发布时间】:2013-07-16 20:00:45
【问题描述】:
考虑以下使用 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,然后根据fn是否内联来决定内联printAll()?
...或遵循其他一些政策?
这个答案是由 C++ 规范规定的,还是编译器实现者可以随意回答?
P。 S. 我知道std::for_each() 将其函数参数作为模板参数,并且模板为内联问题带来了自身的复杂性。除非我弄错了,否则这个细节与问题无关,它与如何做出关于 lambda 和调用它们的函数的内联决策有关。请不要让它不必要地分散您的注意力。
【问题讨论】:
-
lambdas 和模板参数 functionoids 只是具有关联状态的函数,与常规函数+全局变量没有什么不同。由于它们与任何其他函数基本相同,因此它们应该遵循与任何其他函数相同的内联策略。
标签: c++ function c++11 lambda inline