【问题标题】:c++: evaluation of an "if" statement in a lambda functionc ++:评估lambda函数中的“if”语句
【发布时间】:2018-09-12 17:01:01
【问题描述】:

假设我有以下 sn-p 代码:

bool flag = true;

auto myFunction = [](int a, int b, bool flag)
    {
        if (flag)
        {
            // do something with a and b
        }
    }

在后面的代码中,我在一个循环中调用了数千次myFunction对于flag的相同值

然后,我有另一个循环,它也调用 myFunction 数千次,但 flag 的值不同。

我的理解是,作为一个 lambda 函数,它是一个内联函数,因此无论在哪里调用都会重复。

我的问题是:编译器会在“复制”内联函数之前评估if 语句,因此不必在每次迭代时都执行检查吗?

免责声明:

  1. 我知道这可能属于微优化的范畴,但我还是想要一个答案。
  2. 我的例子很愚蠢;我可以将if 语句放在循环之外。但这只是一个更复杂案例的代表性示例。
  3. 我使用 lambda 函数的灵感来自对 this 问题的回答。

谢谢!

【问题讨论】:

  • 如果你的编译器足够聪明,可以内联 lambda 并且能够将分支移出循环 - 没有什么可以阻止它进行这两种优化,但不能保证(我最近看到MSVC 在某个深度停止链接优化,尽管在这种情况下分支预测会为您节省)。

标签: c++11 lambda


【解决方案1】:

我的问题是:编译器会在“复制”内联函数之前评估 if 语句,因此不必在每次迭代时都执行该检查吗?

语言不需要它。如果优化编译器在编译时知道flag 的值,它可能能够实现这一目标。但是,如果不查看编译器生成的汇编代码,就很难判断。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多