Lambda函数性能对捕获的影响

Man*_*d3r 3 c++ lambda

我刚刚写了一个很大的截图:

[this, &newIndex, &indexedDirs, &filters, &flags, &indexRecursion](){...
Run Code Online (Sandbox Code Playgroud)

我使用此lambda(indexRecursion)进行了无数元素的递归,并问自己,使用“全局”捕获是否会更有效[&]。由于我不了解捕获的实现方式,因此需要一些解释。请也有背景。

Dan*_*our 5

通常,您可以将lambda视为与此等效:

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

这应该使您了解如何实现捕获。捕获所有内容(通过复制=或引用获取&)可能只不过是语法糖,用于指定当前范围内用于捕获的所有已使用/可用变量。

但是由于 ...

[..]实现可以定义闭包类型与以下描述的闭包类型不同,但前提是这不会更改程序的可观察行为,除非更改:[..]闭包类型[..]的大小和/或对齐方式。 ]

[N4431§5.1.2/ 3]

...对于实现而言,使用某种“黑魔法”通过引用lambda捕获全部内容是合法的,而仅使用指向捕获的堆栈帧的指针,将对变量的访问重写为对该指针的某些偏移的访问:

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

因此,使用(& 也许有一天)可能会更高效,但是正如已经说过的那样,这是实现定义的,因此无需依赖。