<!-- curated-deep-dive -->
folly/futures/SharedPromise.cpp 深度解读
-
源码行数:25
-
源文件 SHA-256:`d7930e5cb51f31a4c5c2b9545d88ab97e5ab3f82f8df5fb782357f696cbc89fa`
-
文档类型:人工精读版
这个实现文件没有运行期控制流;它的职责是按构建配置集中生成 SharedPromise<Unit> 的模板代码。理解它的关键不在"执行了什么",而在它与头文件中的 extern template 声明怎样共同改变各翻译单元的代码生成。
第 17 行:让完整模板定义在实例化点可见
文件只包含 SharedPromise.h。显式实例化定义必须能看到类模板及相关成员定义,因此这里使用完整头文件,而不是前置声明。Unit 是 Folly Future 体系用来表示"成功但没有业务值"的类型,SharedPromise<Unit> 因而是常见特化。
SharedPromise 与普通 Promise 的语义差异仍由头文件实现决定:前者可向多个订阅者分发同一个完成结果。本文件既不创建共享状态,也不改变订阅或完成规则。
第 21--23 行:extern-template 的定义端
当 FOLLY_USE_EXTERN_FUTURE_UNIT 为真时,template class SharedPromise<Unit> 是显式实例化定义。SharedPromise-inl.h 在同一宏下提供对应的 extern template 声明,使包含头文件的其他翻译单元不必各自发射这组常用成员;本文件成为链接时预期的集中定义端。
这个优化要求库与使用方对宏的取值一致:使用方若只看见 extern 声明而库中没有相应定义,使用到的非内联符号可能无法链接;反过来在多个库中重复提供显式实例化,也会带来 ODR 或重复符号风险。宏关闭时,本行不参与编译,各使用点回到普通模板实例化规则。
语义与边界
-
显式实例化只影响编译时间、目标文件大小和链接归属,不会在进程启动时构造 SharedPromise。
-
它只覆盖 Unit 特化,不替代 SharedPromise<T> 对其他业务类型的按需实例化。
-
编译器最终保留哪些弱符号、内联成员或经 LTO 合并的代码仍取决于工具链,不能把这一行当成固定 ABI 符号清单。