Jus*_*n G 8 c++ performance lambda c++11
我在多个示例中看到,您可以使用单个字符捕获多个变量,如下所示:
Rect rect;
Point point;
auto someLambda = [&](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)
这最终会抓住rect并point通过引用获得访问权限this,但它实际捕获了多少?它只捕获它需要的变量,还是从字面上捕获当前范围内的所有变量?
我在其他示例中看到,您还可以指定要捕获的各个变量:
Rect rect;
Point point;
auto someLambda = [this, &rect, &point](const SomeType& var)
{
if (rect.Contains(point))
{
var.Something();
}
this->MemberFunction();
};
Run Code Online (Sandbox Code Playgroud)
这样或那样做有什么好处吗?我曾与之合作的人曾提到过使用"全部捕获" [&]版本的价格更贵,但我找不到任何文件来支持这一点.我只想确切地知道,所以我不会让代码变得比它需要的更复杂,或者做一些我不应该做的昂贵的事情.
根据http://en.cppreference.com/w/cpp/language/lambda,捕获列表(方括号中的部分)是:
以逗号分隔的零个或多个捕获列表,可选择以捕获默认值开头.捕获列表可以如下传递[...]:
[a,&b]其中a按值捕获,b通过引用捕获.
[this]按值捕获this指针
[&]通过引用捕获lambda体中使用的所有自动变量
[=]按值捕获lambda正文中使用的所有自动变量
[]什么也没捕捉到
这意味着只捕获lambda体中使用的自动(范围 - 生命周期)变量.
我不明白为什么捕获所有东西[&]比单个捕获更昂贵,但明确列出捕获的一个优点是没有机会捕获你没想到的东西.
另一方面,捕获[=]可能证明是昂贵的,因为它将复制一切.也许这就是你的同事所指的.
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |