【发布时间】:2018-03-12 23:59:52
【问题描述】:
我进行了一番搜索,发现了许多使用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);
};
这些方法的性能有什么不同吗?我意识到差异可能可以忽略不计,但我很好奇想知道。
【问题讨论】:
-
个人资料确定。
-
或者查看assembler code。我无法正确阅读汇编程序,但我可以看到绑定版本有很多。
-
在这两种情况下,您可能都应该使用
auto。当您分配给std::function时,lambda 的最大优势(编译器知道确切的类型并且可以更积极地优化)就失去了。 -
如果不知道确切的编译器品牌和版本,就无法回答这个问题,是的,检查汇编和分析是两个通常有用的工具。但是,如果任何
bind表达式确实比直接等效的 lambda 表现得更好,那将证明编译器错过了优化 lambda 的机会。
标签: c++ performance c++11 lambda stdbind