感谢 C + + 11,我们收到了函数包装器的 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(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }
int main() {
using namespace std::chrono;
const auto tp1 = system_clock::now();
for (int i = 0; i < 1e8; ++i) {
calc1([](float arg){ return arg * 0.5f; });
}
const auto tp2 = high_resolution_clock::now();
const auto d = duration_cast<milliseconds>(tp2 - tp1);
std::cout << d.count() << std::endl;
return 0;
}
111ms vs 1241ms 我假设这是因为模板可以很好地内联,而 function
通过虚拟调用覆盖内部。
显然,模板在我看来有它们的问题:
extern template
的策略,否则它们可能会使编译时间大大延长,因此,我是否可以假设 function
可以用作传递函数的 事实上标准,并且在需要使用高性能模板的地方使用?
编辑:
我的编译器是 VisualStudio2012没有CTP。