函数模板和lambda表达式的区别
Differences between function template and lambda expression
// (1)
template<typename T>
T add1(T a, T b)
{
return a + b;
}
// (2)
auto add2 = [](auto a, auto b)
{
return a + b;
};
在这个简单的示例中,我想知道哪种实现在以下方面更好:
- 代码大小(过去使用模板导致"code bloat")
- 执行速度(非平凡函数体有什么区别吗?)
- 内联友好性(在非平凡函数体的情况下,哪种变体更可能被内联?)
回想一下泛型 lambda 基本上定义了一个函数模板 operator()
,所以第二个版本基本上是:
struct __some_uniq_name
{
template<typename T, typename U>
auto operator()(T a, U b) const
{
return a + b;
}
} add2;
这里的代码与add1
*中的代码相同,只是一个是局部变量中的成员函数,一个是自由函数模板。在性能、代码大小或内联能力方面应该没有差异(但总是,测试测试测试!)——唯一的区别是你可以在哪里使用哪个。需要在很多地方添加东西?使用 add1
。需要在一个特定位置使用它吗?使用 add2
.
*除了它允许你添加不同类型的对象,所以如果你需要这样做,你只有一个选择。
// (1)
template<typename T>
T add1(T a, T b)
{
return a + b;
}
// (2)
auto add2 = [](auto a, auto b)
{
return a + b;
};
在这个简单的示例中,我想知道哪种实现在以下方面更好:
- 代码大小(过去使用模板导致"code bloat")
- 执行速度(非平凡函数体有什么区别吗?)
- 内联友好性(在非平凡函数体的情况下,哪种变体更可能被内联?)
回想一下泛型 lambda 基本上定义了一个函数模板 operator()
,所以第二个版本基本上是:
struct __some_uniq_name
{
template<typename T, typename U>
auto operator()(T a, U b) const
{
return a + b;
}
} add2;
这里的代码与add1
*中的代码相同,只是一个是局部变量中的成员函数,一个是自由函数模板。在性能、代码大小或内联能力方面应该没有差异(但总是,测试测试测试!)——唯一的区别是你可以在哪里使用哪个。需要在很多地方添加东西?使用 add1
。需要在一个特定位置使用它吗?使用 add2
.
*除了它允许你添加不同类型的对象,所以如果你需要这样做,你只有一个选择。