故事时间:C++、边界检查、性能和编译器

主要观点:谷歌同事分享将空间安全 retrofitting 到单块 C++代码库的故事,作者回顾了这一过程及相关经验教训,包括对边界检查开销的错误认知、加强实现的路径、让 LLVM 更擅长优化强化、未来的发展方向等。
关键信息:

  • 作者曾对边界检查的性能影响持怀疑态度,认为其难以做到足够便宜以默认启用,但实际效果很好,很多人曾有错误认知,阻碍了相关工作的开展。
  • 行业内通过多种努力克服了对边界检查的压力,如 MSVC 早期在编译器中提供检查,苹果团队推动 LLVM 相关工作等,同时 LLVM 因非 C/C++语言使用而不断改进,PGO 也起到重要作用。
  • 回顾发现 LLVM 和 GCC 过去在优化这类构造方面表现不佳,是因为设计围绕优化无边界检查的 C 和 C++代码,导致优化基础设施未考虑安全检查。
  • 短期需更多人参与构建和维护高质量生产空间安全检查,优化代码生成,长期要更深入质疑性能假设,避免过度怀疑,同时考虑时间安全等问题。
    重要细节:
  • 文中提到边界检查在标准库类型中的开销为 0.3%,强调自己曾的错误观点。
  • 介绍了不同团队在推动边界检查和 LLVM 优化方面的工作,如 Azul 团队等。
  • 阐述了优化编译器在处理安全检查方面的转变,从优先优化不安全代码到处理无处不在的安全检查。
  • 讨论了在不同环境下时间安全的成本和挑战,如 Swift 在小型系统中对引用计数的优化,以及在大型服务器处理器中的问题。
阅读 12
0 条评论