GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing notes.kamacoder.com — C++ Lambda表达式详解:编译器转换原理、捕获列表机制、mutable语义与函数指针的关系 # Lambda 表达式面试官问:"Lambda 的本质是什么?捕获列表是怎么实现的?" 很多人能写出 lambda 的语法,但问到编译器怎么实现的、捕获列表在底层是什么、mutable 为什么需要、无捕获 lambda 为什么能转函数指针,就答不上来了。关键是理解 lambda 的编译器转换原理。 # 简要回答Lambda 本质是编译器生成的匿名仿函数类。语法 值捕获 # 详细回答编译器转换过程
1 2 3 4 然后用当前作用域的 捕获列表的底层机制
mutable 的作用 默认情况下,lambda 的 无捕获 lambda 与函数指针 无捕获的 lambda 没有成员变量,等价于一个普通函数。C++ 标准规定它可以隐式转换为对应签名的函数指针。这让 lambda 能直接传给 C 风格的回调接口。有捕获的 lambda 不能转函数指针——因为它有状态(成员变量),需要对象来承载。
# 知识拓展面试官可能追问: Q1: lambda 和函数指针有什么区别? lambda 是对象(编译器生成的类的实例),函数指针是纯地址。lambda 可以捕获外部变量(有状态),函数指针不能。lambda 能被编译器内联优化(因为类型唯一,编译器知道调用目标),函数指针是间接调用,通常不能内联。无捕获 lambda 可以退化为函数指针,但有捕获的不行。 Q2: 值捕获和引用捕获怎么选? 值捕获安全但有拷贝开销——lambda 比被捕获变量活得久也没问题(因为是副本)。引用捕获零开销但有悬垂风险——如果 lambda 比被捕获变量活得久(比如异步回调),引用就悬空了。原则:短生命周期的 lambda(同步使用、不出作用域)用引用捕获;长生命周期的 lambda(存起来以后用、传给异步任务)用值捕获。 Q3: C++14/17/20 对 lambda 有什么增强? C++14:泛型 lambda(参数用 Q4: lambda 什么时候不该用? 三种情况:函数体超过 5~10 行(可读性差,应该提取为命名函数);需要在多处复用同一逻辑(应该定义普通函数或仿函数);需要递归(lambda 不能直接递归调用自己,需要用 评论验证登录状态... |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |