【问题标题】:using named lambda vs function - extra space usage for a variable in case of lambda?使用命名的 lambda 与函数 - 在 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 变量很可能会被优化掉,因为它是一个没有数据成员的空对象。

标签: c++ c++11 variables lambda c++14


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2023-03-05
    • 2018-09-13
    • 1970-01-01
    • 2021-10-13
    • 2018-03-20
    相关资源
    最近更新 更多