[英]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.