【发布时间】:2013-03-07 13:25:27
【问题描述】:
我有一个函数模板:
template <class ReportFunc>
void func (ReportFunc report_func)
{
for (/* ... */)
{
do_something (a, b);
report_func (a, b, c);
do_something_else (b, c);
}
}
有时需要在没有任何 ReportFunc 的情况下调用 func(),即循环只调用 do_something() 和 do_something_else() 而没有别的。如果我编写了一个不带 ReportFunc 参数的 f() 重载,我将不得不复制 f() 的实现代码,只需删除调用 report_func() 的行。
我有几个此类函数 - 有时我想用 ReportFunc 调用它们,有时不使用它。所以我想避免所有的代码重复。如果我传递一个空的 lambda 或 void 或类似的东西,它是否应该让 C++11 编译器生成一个不调用任何 report_func() 的 f() 实例?它是否与简单地删除调用 report_func() 的行一样快,甚至一个空的 lambda 也会有一些编译器未优化的开销? (在我的具体情况下,我使用 GCC)
另外:如果一个空的 lambda 确实这样做,并且我将函数 f() 的返回类型更改为 ReportFunc,即它返回 report_func 参数,将返回值存储在变量中并调用是否仍然安全它? (即使它是一个空的 lambda?所以理论上可以调用它,它只是意味着什么都没有发生)
【问题讨论】:
-
向它传递一个带有空内联
operator()的函数对象。一个普通的空内联函数也应该可以工作。 -
@n.m.如果我传递一个空的 lambda 怎么办,它会一样快吗?我问是因为它使代码看起来更好:lambda 是在使用它的地方定义的,而不是在代码中的其他地方定义的,就像函子一样
-
lambdas 只不过是普通函子的语法糖——它们的性能应该相同。和往常一样,试试看:)
-
当函数地址是编译时常量时,函数将与最新版本的 GCC 一起工作,优化间接调用,例如您调用
func( &doNothing )而不是func( some_func_ptr )其中some_func_ptr是一个在其他地方设置了值的变量。 -
我刚刚检查了 g++,它优化了一切,lambda、对象和(使用 -O3)函数。
标签: c++ templates c++11 lambda callback