C++ 为什么将函数包装到lambda中可能会使程序更快?

C++ 为什么将函数包装到lambda中可能会使程序更快?,c++,performance,lambda,stl,inlining,C++,Performance,Lambda,Stl,Inlining,标题可能太笼统了。我在大型向量v上对以下两个语句进行基准测试: sort(v.begin(), v.end(), l); sort(v.begin(), v.end(), [](unsigned a, unsigned b) { return l(a, b); }); 其中l定义为 bool l(unsigned a, unsigned b) { return a < b; } 在g++和MSVC上进行了测试 更新: 我发现lambda版本生成的汇编代码与默认版本完全相同(sort(

标题可能太笼统了。我在大型
向量v
上对以下两个语句进行基准测试:

sort(v.begin(), v.end(), l);

sort(v.begin(), v.end(), [](unsigned a, unsigned b) { return l(a, b); });
其中
l
定义为

bool l(unsigned a, unsigned b) { return a < b; }
在g++和MSVC上进行了测试

更新:


我发现lambda版本生成的汇编代码与默认版本完全相同(
sort(v.begin(),v.end())
),而使用函数的版本则不同。但是我不知道汇编,因此不能做更多的事情。

排序
可能是一个很大的函数,所以它通常不是内联的。因此,它是单独编译的。考虑<代码>排序< /代码>:

template <typename RanIt, typename Pred>
void sort(RanIt, RanIt, Pred)
{
}
模板
无效排序(RanIt、RanIt、Pred)
{
}
如果
Pred
bool(*)(无符号,无符号)
,则无法内联函数-函数指针类型无法唯一标识函数。只有一个
排序
,所有使用不同函数指针的调用都会调用它。用户将
l
传递给函数,但这只是作为普通参数处理。因此,不可能内联调用

如果
Pred
是lambda,那么内联函数调用就很简单了-lambda类型唯一地标识函数。对
sort
实例化的每次调用都调用相同的(lambda)函数,因此函数指针没有问题。lambda本身包含对
l
的直接调用,这也很容易内联。因此,编译器内联所有函数调用并生成与无谓词排序相同的代码



函数闭包类型(
std::less
)的情况类似:在编译
sort
时调用
std::less
的行为是完全清楚的,因此内联很简单。

对不起,我不太明白。您所说的“如果Pred是lambda,那么内联函数调用很简单”是什么意思?这是否意味着比较是在函数
sort
?@user中编译的?原因在破折号“-”之后给出:lambda类型唯一标识一个函数。@L.F.这是否意味着比较是在函数sort中编译的?@user当模板实例化时,编译器显然知道用于实例化它的类型(lambda类型),所以是的,你是对的,但根据汇编,情况并非如此。它们是:
std::_Sort_unchecked(07FF7873F1D50h)
对于无pred的函数,
std:_Sort_unchecked(07FF7873F17D0h)
对于函数,以及
std:_Sort_unchecked(07FF7873F1A80h)
对于lambda
template <typename RanIt, typename Pred>
void sort(RanIt, RanIt, Pred)
{
}