为什么我应该在 C++ 中使用函数而不是命名的 lambda

why should I use function instead of named lambdas in C++

提问人:Mahashi 提问时间:7/28/2023 更新时间:7/31/2023 访问量:89

问:

最近我在函数推导方面遇到了很多困难,当然 lambda 在这里被证明更灵活,但这样做我遇到了一个问题,为什么我应该使用函数而不是命名 lambdas?

例如:

namespace
{
auto foo(auto && arg1, auto && arg2){
    return arg1 + arg2;
}

auto bar = [](auto&& arg1, auto && arg2){
    return arg1 + arg2;
}
}

bar在做模板和东西时更灵活,但是使用有什么缺点吗?实际编程中的性能或内存成本?我已经使用汇编输出运行了一些测试,并且在某些情况下证明 bar 的指令更少。bar

C++ C++11 模板 Lambda 元编程

评论

0赞 273K 7/29/2023
至少你用 lamdas 输入更多,lamdas 是经常在运行时创建的对象。在某些情况下,一些带有汇编输出和 bar 的测试被证明指令更少——向我们展示这个案例。
1赞 Marek R 7/29/2023
请参阅此 cppinsights.io/s/1c45ed0b
2赞 chrysante 7/29/2023
一个区别是你不能超载。不过,应该没有任何性能差异。bar
2赞 Jarod42 7/29/2023
也有 ADL 差异。
0赞 Yakk - Adam Nevraumont 7/31/2023
@273K什么?不。无状态 lambda “占用 1 个字节”,但不会执行任何运行时操作来创建它们。

答:

0赞 Yakk - Adam Nevraumont 7/31/2023 #1

函数支持重载,支持将声明与实现分离。

此外,函数还参与一种称为“参数相关解析”的东西。搜索类命名空间中的函数时,不会在调用它们的行上显式命名命名该命名空间。

namespace some_ns {
  struct some_struct {};
  void some_function( some_struct );
}

如果你有

some_ns::some_struct bob;
some_function(bob);

然后将被找到,而不会在呼叫线路上提及。some_ns::some_functionsome_ns

您可以使用继承技巧让 lambda 参与重载解析,但即便如此,它也是一组封闭的重载。