蓝星最熟悉STL的人:Stephan T. Lavavej
STL大牛人Stephan T. Lavavej在CppCon 2020上做了一个十分精彩的演讲,内容涵盖了integer comparison functions, constexpr algorithms, uniform container erasure, atomic_ref和span等,这些主题都搭配了完整的示例程序(而不是代码片段),开发者可以通过这些例子来深入理解最新的STL实现背后的原理。
在Stephan演讲的结尾,观众提出了很多感兴趣的问题,因为时间的关系,他只回答了其中的几个比较典型的问题。下面我们具体来看看他怎么说。
Q: 为什么要压缩PR(Squash pull requests),而不是简单的合并它们?
A: 我们之所以选择这种提交方式,是因为它可以大大简化分支的历史,因为每一次压缩的commit等同于一次PR。你仍然可以在仓库中查看到所有PR的历史记录。如果合并的话,将产生高度非线性化的提交历史记录(这会增加查看代码变更细节的难度,在MSVC的内部仓库里充满了这种非线性的合并提交,这为查看代码变更带来了很大的困难)。
大多数的非压缩合并都是一些不那么令人感兴趣的部分,它们基本上是一些代码Review的反馈,以及开发阶段的Bug修复。对于非常不常见的情况,我可以想象将PR序列化为一系列的commit,然后将其重定向并合并到默认分支,我们需要通过策略临时启用该分支,但通常PR中留下这个历史记录就足够开发者查看了。
Q: 关于atomic_ref,为什么不指定宽松的访问权限呢?
A: 我的理解是,更宽松的访问控制仍然比普通操作更加耗费资源。
例如,在用于MSVC的x86/x64平台上,原子增量由_InterlockedIncrement实现,即使你要求宽松访问,它也会提供完整的顺序一致性。我听说这大约花费10-100个周期,而普通的增量是半个周期或更短。即使在ARM/ARM64上,也有_Meow_nf个内在函数(”no fence”)可以放宽,我相信与普通操作相比,它们仍然隐含着额外的成本。
Q: 你认为将STL开源会提高STL的团队的开发效率吗?有担心过与第三方贡献者的合作会带来太多的开销吗?
A: 这是一个很好的问题。这是我们在开源过程中考虑最多/最为担心的事情之一。