std::bind 与 lambda 的效率

Efficiency of std::bind vs lambda

我搜索了一下,发现了很多使用 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);
};

这些方法的性能有什么不同吗?我意识到差异可能可以忽略不计,但我很好奇想知道。

Is there any difference in the performance of these approaches?

也许,也许不是;正如评论者所建议的那样 - 要检查的配置文件,或查看您获得的汇编代码(例如使用 GodBolt Compiler Explorer)。但是你问错了问题,主要有两个原因:

  1. 您可能不应该在代码的 performance-critical 部分传递 lambda 或 bind() 结果。
  2. 你应该明确地避免通过函数指针或std::function变量在代码的performance-critical区域调用任意函数(除非这可以是de-virtualized 并由编译器内联)。

还有一个原因:

  1. Lambda(和 std::bind() 的)是可用的,并且有用,没有被包裹在 std::function 中;此包装器有其自身的性能损失,因此您只能比较使用这些构造的一种方式。

底线建议:只使用 Lambdas。它们更简洁、更容易理解、编译成本更低,而且在语法上更灵活。所以不要担心,要开心 :-) 。在 performance-critical 代码中,要么使用没有 std::function 的 Lambda,要么不使用两者中的任何一个。