【发布时间】:2015-12-21 04:55:08
【问题描述】:
我查看了另一个关于 std::function 的堆栈溢出问题以及为什么它很慢,但我仍然不相信/不明白。我从问题中运行了程序,并进行了一些修改。
#include <iostream>
#include <functional>
#include <string>
#include <chrono>
template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }
float calc2(const std::function<float (float)>& f) { return -1.0f * f(3.3f) + 666.0f; }
int main() {
std::function<float (float)> f = [](float arg){ return arg * 0.5f; };
for (int i = 0; i < 1e9; ++i) {
// calc2(f);
calc1([](float arg){ return arg * 0.5f; });
}
return 0;
}
使用模板版本,代码运行时间为 4 秒,但涉及 std::function 的运行时间增加到 15 秒。我理解为什么复制一个 std::function 会很昂贵,但是在这里即使传递了一个引用,似乎也没有什么区别,有人可以解释为什么会发生这种情况吗?
仅供参考,这是我输入 g++ --version 时的输出
Apple LLVM version 7.0.2 (clang-700.1.81)
【问题讨论】:
-
您是否在打开优化的情况下进行编译?
-
是的,启用优化后,常规代码只需要 0.4 秒,我假设根本没有执行任何操作,因为代码中的其他地方没有依赖关系,但是使用 std::function 运行时变为 1.9 秒
-
@NirFriedman:这是不同的。
std::function不仅仅是一个函子。它使用类型擦除,这是一个显着的区别。 -
@Cornstalk 的标题只是误导,问题是关于 std::function。接受的答案(我的,完全公开)深入比较 std:: 函数和 lambda,甚至查看生成的程序集。
-
@NirFriedman:该死。好吧,至少现在你已经获得了 >2k 的代表,所以你不应该再有这个问题了 :)
标签: c++ templates c++11 c++14 std-function