使用命名的 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投票通过