使用函数作为模板参数的不同方法

时间:2014-04-24 10:09:35

标签: c++ templates

我需要创建一个模板函数来调用可交换的" 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函数的不同可能性:

  1. 内联功能

    inline int fooInline(int a) { return a + 1; }
    exec(fooInline);
    
  2. 来自其他编译单元的定义的函数

    int fooSrc(int a);
    exec(fooSrc);
    
  3. 功能对象

    struct FooOp {
        int operator()(int a) { return a + 1; }
    };
    exec(FooOp());
    
  4. std::function(例如绑定到内联函数)

    std::function<int(int)> fooFnc = std::bind(&fooInline);
    exec(fooFnc);
    
  5. LAMBDA

    auto fooLambda = [](int a) { return a + 1; };
    exec(fooLambda);
    
  6. 临时lambda

    exec([](int a) { return a + 1; });
    
  7. 这些方法有什么区别?什么是最快的方式?我可以假设exec(fooInline)实际内联fooInline吗?

1 个答案:

答案 0 :(得分:0)

在C ++中,你的问题没有答案,哪一个是最快的。您可以在您的特定环境中进行衡量,但是再次您没有任何保证。

猜测是编译器有最大的机会内联,如果它可以轻松访问worker函数的源,那么内联函数或临时lambda将是最好的。但是仍然是一个不错的编译器可能会列出你列出的所有方法。