感谢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;
}
111毫秒和1241毫秒。我想这是因为模板可以很好地内联,而function封面通过虚拟呼叫的内部。
显然,模板在我看来有其问题:
他们的头是不是你可能不希望释放你的库作为一个封闭的代码时做的提供,
除非extern template引入类似政策,否则它们可能会使编译时间更长。
没有(至少在我的面前)代表要求的清洁方式(概念,任何人吗?)模板,扎描述什么样的函子有望评论。
因此,我可以假定functions可以用作传递函子的事实上的标准,并且应该在期望使用高性能模板的地方使用吗?
开满天机
饮歌长啸
相关分类