函数组合的宏没有开销或者开销最小

时间:2017-06-30 09:14:51

标签: c++ functional-programming macros metaprogramming c++17

假设我们有一个如下功能:

void blax(T t) {
    for {...
            //Stuff
                auto variable = generator(previous_internal_value); 
            //Stuff
    }
}

在函数内部深处有一个名为" generator"的另一个函数。功能" blax"可以轻松修改以实现另一个角色,让我们调用此函数" blax2"。

两者之间实施的唯一区别是' balx2'使用函数generator2:

void blax2(T t) {
    for {...
            //Stuff
                auto variable = generator2(previous_internal_value); 
            //Stuff
    }
}

我希望有一种编写这两种功能的通用方法。我想出的是:

    void generic_blax(T t, std::function<int(int)> generator_impl) {
            for {...
                    //Stuff
                        auto variable = generator_impl(previous_internal_value); 
                    //Stuff
            }
        }


void blax(T t) {
    return generic_blax(t, generator)
}

void blax2(T t) {
    return generic_blax(t, generator2)
}

这个实现一切都很好,但我不确定所述代码的效率。所以我的问题有三个:

有没有办法完成这个功能&#34;注射&#34;通过一个宏,这样我就不必在运行的nr函数和函数调用中受到惩罚了吗?

如果没有,使用std :: function而不是函数指针会导致性能下降吗?

并且,尝试强制推理“generic_blax”是明智的吗?使用内联关键字,以获得更接近我所拥有的性能,如果blax和blax2有他们的&#34;正常&#34;功能体?或者在“blax_generic&#39;之前放置内联没有内联函数,如果它太大(即使这只需要在两个地方发生)?

2 个答案:

答案 0 :(得分:4)

不要使用std::function<...>,而应考虑使用模板。宏被认为是有害的,因为它们对函数调用的行为略有不同,但看起来一样。

template <class Generator>
void generic_blax(T t, Generator generator_impl) {
    for {...
        //Stuff
        auto variable = generator_impl(previous_internal_value); 
        //Stuff
        }
    }

您甚至不必更改通话网站

void blax(T t) {
    return generic_blax(t, generator)
}

void blax2(T t) {
    return generic_blax(t, generator2)
}

N.B。关键字inline不再具有内联相关的任何内容,并且它永远不会强制它。链接时优化可以包括跨TU的内联

答案 1 :(得分:0)

你可以在内联中继,大多数编译器在这里做。

如果您希望保证零成本,您可以将生成器功能包装到仿函数&amp;以下列方式修改代码:

template <class Generator>
void generic_blax(T t) {
   for {...
     //Stuff
     auto variable = Generator()(previous_internal_value); 
     //Stuff
   }
}