我进行了一些搜索,发现了许多使用 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 )。但您问错了问题,主要原因有两个:
- 您可能不应该在代码中性能关键的部分传递 lambda 或
bind()
结果。 - 您应该绝对避免在代码的性能关键区域中通过函数指针或
std::function
变量调用任意函数(除非可以去虚拟化)并由编译器内联)。
一心一意的理由:
- Lambda(和 std::bind())是可用且有用的,无需包装在 std::function 中;这个包装器有其自身的性能损失,因此您只会比较使用这些构造的一种方法。
底线建议:只使用 Lambda。它们更干净、更容易理解、编译成本更低并且语法更灵活。所以别担心,开心就好:-)。在性能关键型代码中,要么使用 Lambda 而不使用 std::function
,要么不使用两者中的任何一个。
关于c++ - std::bind 与 lambda 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246242/