使用命名的 lambda 与函数 - 在 lambda 的情况下变量的额外空间使用?

Posted

技术标签:

【中文标题】使用命名的 lambda 与函数 - 在 lambda 的情况下变量的额外空间使用?【英文标题】:using named lambda vs function - extra space usage for a variable in case of lambda? 【发布时间】:2021-11-19 02:36:26 【问题描述】:

所以简化的代码 sn-p (1) 将是

void f2(someClass* ptr, int x)

//some code


void f(someClass* ptr, bool cond)

//do something with ptr
    if (someConditionThatIsResultOfFunctionWork)
   
    if (cond)
    
      //do something else with ptr
      f2(ptr, x1);
    
     else
        
          //do something else with ptr
          f2(ptr, x2);
         
    

代码sn-p(2):

void f(someClass* ptr, bool cond)

 auto f2asLambda = [](someClass* ptr, int x)

//some code
;
//do something with ptr
if (someConditionThatIsResultOfFunctionWork)

if (cond)

  //do something else with ptr
  f2asLambda(ptr, x1);

 else
    
      //do something else with ptr
      f2asLambda(ptr, x2);
     


这些代码 sn-ps 在性能等方面是否相同?如果 (2) 将为 lambda 创建额外的变量,而我们可能根本不调用它,它是否使使用函数而不是命名的 lambda 更可取?

【问题讨论】:

您应该根据f2 是否属于f 来决定两者。性能是当你有工作代码然后根据基准做出决定时衡量的东西;) "...我们可能根本不会调用它"如果您在 if (someConditionThatIsResultOfFunctionWork) 分支中定义 lambda 则不会 @463035818_is_not_a_number 如果在现实中使用更多 if-else 会更复杂一些,所以我不能只将 lambda 移动到 if 以确保它总是被调用,仍然有分支不会调用它。那么使用函数会是更好的选择吗? 很可能没有区别。编译器实际上会将第二个片段重写为第一个片段,只有f2 函数将被命名为SomeClassName::operator()f2asLambda 变量很可能会被优化掉,因为它是一个没有数据成员的空对象。 【参考方案1】:

除非您开始在 lambda ex 中使用局部变量,否则生成的输出将是相同的:

void test(int abc) 
    auto testfn = [&]() 
        return abc + 5;
    ;
    testfn();

反编译输出:

void __fastcall test(int abc)

  int v1; // [rsp+20h] [rbp-18h]
  int v2; // [rsp+40h] [rbp+8h]

  v2 = abc;
  lambda_33f9b2a517f89afbe56cddae6ec6364f_::_lambda_33f9b2a517f89afbe56cddae6ec6364f_(&v1, (__int64)&v2);
  lambda_132f59ee0fb0da8eec42827bd7f66058_::operator()((_DWORD **)&v1);

【讨论】:

以上是关于使用命名的 lambda 与函数 - 在 lambda 的情况下变量的额外空间使用?的主要内容,如果未能解决你的问题,请参考以下文章

主网001提案|销毁Lambda研发团队持有的7亿LAMB投票通过

Python Lambda函数

模板函数与带有自动参数的命名 lambda

python中的zipmapreduce lambda函数的使用

如何TBB获得150%LAMB的质押挖矿收益?

Java8新特性03 Lambda表达式