【发布时间】: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 语句,因此不必在每次迭代时都执行检查吗?
免责声明:
- 我知道这可能属于微优化的范畴,但我还是想要一个答案。
- 我的例子很愚蠢;我可以将
if语句放在循环之外。但这只是一个更复杂案例的代表性示例。 - 我使用 lambda 函数的灵感来自对 this 问题的回答。
谢谢!
【问题讨论】:
-
如果你的编译器足够聪明,可以内联 lambda 并且能够将分支移出循环 - 没有什么可以阻止它进行这两种优化,但不能保证(我最近看到MSVC 在某个深度停止链接优化,尽管在这种情况下分支预测会为您节省)。