我刚刚写了一个很大的截图:
[this, &newIndex, &indexedDirs, &filters, &flags, &indexRecursion](){...
Run Code Online (Sandbox Code Playgroud)
我使用此lambda(indexRecursion)进行了无数元素的递归,并问自己,使用“全局”捕获是否会更有效[&]。由于我不了解捕获的实现方式,因此需要一些解释。请也有背景。
通常,您可以将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)
因此,使用(& 也许有一天)可能会更高效,但是正如已经说过的那样,这是实现定义的,因此无需依赖。
| 归档时间: |
|
| 查看次数: |
1627 次 |
| 最近记录: |