我需要创建一个模板函数来调用可交换的" worker"一遍又一遍地运作。
template<class F>
int exec(F f) {
long long s = 0;
for(int i=0; i<1000000; i++) {
s += f(i); // many calls to f
}
return s;
}
现在我想到了定义worker函数的不同可能性:
内联功能
inline int fooInline(int a) { return a + 1; }
exec(fooInline);
来自其他编译单元的定义的函数
int fooSrc(int a);
exec(fooSrc);
功能对象
struct FooOp {
int operator()(int a) { return a + 1; }
};
exec(FooOp());
std::function
(例如绑定到内联函数)
std::function<int(int)> fooFnc = std::bind(&fooInline);
exec(fooFnc);
LAMBDA
auto fooLambda = [](int a) { return a + 1; };
exec(fooLambda);
临时lambda
exec([](int a) { return a + 1; });
这些方法有什么区别?什么是最快的方式?我可以假设exec(fooInline)
实际内联fooInline
吗?
答案 0 :(得分:0)
在C ++中,你的问题没有答案,哪一个是最快的。您可以在您的特定环境中进行衡量,但是再次您没有任何保证。
猜测是编译器有最大的机会内联,如果它可以轻松访问worker函数的源,那么内联函数或临时lambda将是最好的。但是仍然是一个不错的编译器可能会列出你列出的所有方法。