繁体   English   中英

Lambda函数性能对捕获的影响

[英]Lambda function performance impact of capture

我刚刚写了一个很大的捕获:

[this, &newIndex, &indexedDirs, &filters, &flags, &indexRecursion](){...

我使用这个lambda(indexRecursion)进行带有元素的递归,并问自己,使用“全局”捕获[&]是否更有效。 由于我不知道捕获的实现,我需要一些解释。 请带背景。

通常你可以认为lambda等同于:

class ANON {
  int data;
  public:
    void operator ()(void) const {
      cout << data << endl;
    }
} lambda;
// auto lambda = [data]() {cout << data << endl;}

这应该可以让您了解如何实现捕获。 捕获所有(通过copy =或reference & )可能只是用于指定当前范围内捕获的所有已用/可用变量的语法糖。

但是由于 ...

[..]一个实现可以定义闭包类型与下面描述的不同,前提是这不会改变程序的可观察行为,只需更改:[..]闭包类型的大小和/或对齐[.. ]

[N4431§5.1.2/ 3]

...通过引用lambdas使用某种“黑魔法”进行捕获并使用指向捕获的堆栈帧的指针,重写对变量的访问作为对该指针的某些偏移的访问,这是合法的。

class ANON {
  void * stack_frame;
  public:
    void operator ()(void) const {
      cout << *static_cast<int *>(stack_frame + 8) << endl;
    }
} lambda;

所以使用& may (某天)会更有效率,但正如已经说过的那样,这是实现定义的,这没有什么可以依赖的。

内部lambdas /通常/实现为ad-hoc类,其单个实例对象在lambda定义点构造,并且暴露了稍后要调用的仿函数。 因此,应该将lambda性能与使用std::bind方法传递给函数进行比较。

捕获也不是神秘的实体。 如果捕获是引用捕获,那么它们引用的实体在像往常一样走出范围时会被破坏,所以要注意你的lambda是否不是本地的:在它的体内它可能引用已经被破坏的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM