gpt4 book ai didi

c++ - C++ 编译器是否会独立决定内联 lambda 函数及其调用者?

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:45 28 4
gpt4 key购买 nike

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

最佳答案

printAll 内内联调用 fn 的决定独立于内联 printAll 的决定。特别是,fn 有很高的机会在所有编译器中内联,std::for_each 也是如此,但是因为 printAll 包含一个循环(for_each 中的循环)在某些编译器中内联下降的可能性(内联的一些启发式方法包括代码的复杂性和循环的存在)。

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

First decide about fn using the usual heuristics, then decide about inlining printAll() based on whether fn was inlined?

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

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

关于c++ - C++ 编译器是否会独立决定内联 lambda 函数及其调用者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685872/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com