- 主题:[原创]Linux 下 C++20 modules 在正式项目中的实践
先介绍一下项目:github /infiniflow/infinity (链接实在发不出来,见谅),这是我们刚开源的一个面向AI应用的数据库系统,提供高性能向量搜索、全文搜索和结构化数据查询。
除去单元测试,项目目前代码量12~13w,依赖了100多万行第三方代码。没有用modules之前,各种已知编译优化方案都用上了(PCH,减少头文件依赖啥的),编译时间最少也要5分钟,改个头文件就需要编译一下也需要4分钟。modules化之后,全新编译2分钟左右,大的增量编译1分钟左右完成,效果还是比较明显的。
环境的要求:
CMake: 3.28,最近Release 3.28才正式支持modules
Clang-17及以上,Clang-17对modules支持相对完整,当然目前还在dev状态的Clang-18也可以
这里有一些使用细节上的参考:
github /infiniflow/infinity/blob/main/src/common/stl.cppm
这个文件示例了如何解决由于C++标准库没有modules化导致的各类编译错误;
github /infiniflow/infinity/blob/main/src/common/third_party.cppm
这个文件示例了如何在项目中引入其他没有modules化的第三方依赖库。
C++ Modules从C++ 20提出以来至今已经有3年多,目前仍然很少在开源项目中看到,之前只有 async_simple 有个 modules 的 branch 有过相关实践,其他都是一些玩具项目。后续,我们会继续优化modules的使用,包括对stl和thirdparty代码封装的优化,submodules等。欢迎大家关注和多提建议,谢谢。
--
FROM 116.226.71.*
third_party那块挺乱的,还有clang目前还没有标准库的modules,自己封装的时不时也有点问题。
【 在 KnightZorro 的大作中提到: 】
: 你们团队的代码真不错!
--
FROM 101.224.43.*
没错,不过自从c++11开始,c++也是在不断进化中。新的特性啥的,也比较有趣。
--
FROM 222.64.172.*
有一段时间没上水木了,原则上是可以的。这么大的项目,总归是按照模块划分的。可以自顶向下开始,把每个.h先包装成module,这样入口部分就是module了,后面的话一个一个.h的改造。但是,这块细节要做了才知道,需要踩哪些坑
【 在 DoorWay 的大作中提到: 】
: 大佬指点下,把一个老项目改成module的,应该从哪里开始?希望一个文件一个文件来,改一半也能停止。因为能给分配的人日不多。
: vs2022,版本17.4。 项目大概70万行,是一个插件。被某平台加载。平台是上古项目大概有30年+历史,盲猜c++98,甚至MFC、C。插件编译,包含平台的.h,通过一个platform.h,里面包含了不计其数的.h,链接平台的dll。改平台是不可能的,平台不会提供module。
: 只改插件,这种项目可行吗?
: ...................
--
FROM 183.192.20.*