如果我在lambda函数中使用[this]而不是[=],是否有任何性能提升?

kie*_*wic 5 c++ lambda c++11

据我所知,[=]复制函数体内使用的所有变量,而[this]只复制this指针.但看看样品,我看到[=]广泛使用的地方[this][this, foo]足够.是否有任何理由(例如性能增益)[this]而不是[=]

Xeo*_*Xeo 10

没有性能提升,因为如你所说,只复制你在lambda中实际使用的变量[=].编码器的部分主要是懒惰,保持lambda头部简洁.如果使用新变量,则必须扩展capture子句以包含这些变量,meh.但是,有时候,您希望/必须明确,例如,当您想要按引用和按值捕获混合时.


†请注意,目前,以下代码段中的[=](或偶数[x])不会将成员变量复制到lambda中,这与您的预期相反:

struct X{
  std::function<void()> f(){
    return [=]{ std::cout << "x: " << x << "\n"; };
  }

  int x;
};
Run Code Online (Sandbox Code Playgroud)

相反,你会得到一份副本this.如果lambda超出父对象,并且为了使其正常运行,这可能会导致问题,您当前需要在主体内部创建一个本地名称f并捕获/使用它.此名称可以是引用或值.我更喜欢引用,因为它少了一个副本(对于引用,成员将仅复制到lambda中,而对于值,首先将成员复制到该成员然后复制到lambda中).

struct X{
  std::function<void()> f(){
    auto& x_ref = x;
    return [=]{ std::cout << "x: " << x_ref << "\n"; };
  }

  int x;
};
Run Code Online (Sandbox Code Playgroud)

但是,有一项建议是让[=]and [member_name]capture子句复制该成员.如果您想要参考,则需要捕获[this].


‡感谢@MooingDuck的启蒙.