c++ - std::bind 与 lambda 的效率

标签 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);
};

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

最佳答案

Is there any difference in the performance of these approaches?

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

  1. 您可能不应该在代码中性能关键的部分传递 lambda 或 bind() 结果。
  2. 您应该绝对避免在代码的性能关键区域中通过函数指针或std::function变量调用任意函数(除非可以去虚拟化)并由编译器内联)。

一心一意的理由:

  • Lambda(和 std::bind())是可用且有用的,无需包装在 std::function 中;这个包装器有其自身的性能损失,因此您只会比较使用这些构造的一种方法。
  • 底线建议:只使用 Lambda。它们更干净、更容易理解、编译成本更低并且语法更灵活。所以别担心,开心就好:-)。在性能关键型代码中,要么使用 Lambda 而不使用 std::function,要么不使用两者中的任何一个。

    关于c++ - std::bind 与 lambda 的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246242/

    相关文章:

    c++ - 并行写入相同的值

    c++ - 查找 map C++ 未找到已添加到 map 中的键

    c++ - std::set<std::pair<size_t, std::string>>::find(),没有字符串复制构造

    java - Java EE 应用程序中的实用程序类应该是 EJB 还是具有静态方法的类

    javascript - 哪些浏览器支持&lt;script async ="async"/>?

    c# - 是否可以将表单控件放在自己的线程上?

    c++11 列表 push_back() 实例错误?

    c++ - 在 C++11 中实现 std::tuple 的字典序比较

    c++ - 如何在具有不同模板参数的 C++ 模板之间隐式转换

    c++ - 如何在同一容器(C++)中显示来自不同应用程序的用户界面?