xml*_*lmx 18 c++ performance lambda coding-style c++11
std::function<int()> void f1()
{
int a, b, c, d, ..., x, y, z;
return [=] { return a + b + c; };
}
Run Code Online (Sandbox Code Playgroud)
与
std::function<int()> void f2()
{
int a, b, c, d, ..., x, y, z;
return [a, b, c] { return a + b + c; };
}
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,前者比后者更短,更方便,更优雅.
但是,我仍然担心:
从性能的角度来看,后者总是优于前者吗?
标准是否保证lambda表达式仅捕获必要的变量?即,在前一示例中,仅捕获a,b,c,未使用的变量d,...,x,y,z不是.
Jer*_*fin 26
该标准保证,如果执行默认捕获,那么将从周围环境捕获的默认捕获的唯一变量是您实际在lambda中使用的变量.
因此,指定要捕获的各个变量充当您期望使用的文档,但绝不应影响性能.
对于任何关心的人,标准中的确切措辞是(§5.1.2/ 11,12):
11如果lambda表达式具有关联的capture-default及其复合语句odr-uses(3.2)
this或具有自动存储持续时间的变量且未明确捕获使用了odr的实体,则表示使用了odr的实体被隐含地捕获; 这些实体应在lambda表达式的范围内声明.[ 注意省略 ]12如果明确或隐含地捕获实体,则捕获该实体.[...]
简介:隐式捕获规范([=]或[&])仅捕获lambda中使用的变量.