std :: bind vs lambda

时间:2018-03-12 23:59:53

标签: c++ performance c++11 lambda stdbind

我已经搜索了一下,发现了许多例子和讨论你将使用std::bind而不是lambda的情况,但我遇到的一个问题是,是否有任何性能上的好处。其他。我将描述我的用例:

我有一个通用的A*我已经实现了,我传递了后继,启发式距离和移动成本函数。

以下是我的启发式函数示例,可以将其传递给搜索(两种形式):

std::function<float(const Location*, const Location*)> hdist = std::bind(&TerrainMap::straightLineDist, this, std::placeholders::_1, std::placeholders::_2);

std::function<float(const Location*, const Location*)> hdist2 = [this](const Location* a, const Location* b){
    return straightLineDist(a,b);
};

这些方法的表现有何不同?我意识到差异可能微乎其微,但我很好奇想知道。

1 个答案:

答案 0 :(得分:2)

  

这些方法的表现有何不同?

也许,也许不是;正如评论者所建议的 - 要查看的个人资料,或查看您获得的汇编代码(例如使用GodBolt Compiler Explorer)。但是你提出了错误的问题,主要有两个原因:

  1. 您可能不应该在代码中性能至关重要的部分传递lambda,而不是bind()结果。
  2. 你应该肯定避免在代码的性能关键区域中通过函数指针或std::function变量调用任意函数(除非这可以通过编译器进行去虚拟化和内联)
  3. 和一个心灵原因:

    1. Lambdas(和std::bind())是可用的,有用的,不包含在std :: function中;这个包装器有自己的性能损失,所以你只能比较一种使用这些结构的方法。
    2. 底线推荐:只需使用Lambdas。它们更清晰,更易于理解,编译成本更低,语法更灵活。所以不要担心,要开心:-)。在性能关键代码中,要么使用没有std::function的Lambda,要么不使用任何两个。