C++20模块会改变静态库和共享库的结构吗
Will C++20 modules change the anatomy of static and shared libraries?
传统上,C++库由一个头文件+编译在二进制文件(.a
、.so
、.dylib
、.dll
…(中的实现组成。头文件在源代码中是#include
d,二进制部分链接到最终可执行文件。
C++20中的模块会改变这种布局吗?如果是这样,操作系统是否必须升级其核心库的分发方式,例如Linux中的标准库或Windows中的其他核心dll?
当然。与传统的头/库相比,模块是向用户表示库代码的一种非常不同的类型。模块的主要优点是编译器可以将其解析到抽象语法树(AST(级别。每个模块只发生一次这种情况——与每次包含特定头文件的情况相反。因此,加速的一种可能性是将非常频繁的头文件转换为模块,并节省大量编译器时间,而不是多次重新编译到AST,而只是一次。AST同样适用于模板。。。它是对C++语言的一个通用而完整的描述。
但这也是目前主要的";缺点":AST完全依赖于编译器。供应商、系统甚至编译器版本之间都不稳定。因此,分发AST毫无意义,至少在当前的工具链环境中是这样。
因此,在我的理解中,模块不容易取代常见的头/库。它们是轻量级(仅限最佳标头(和潜在的高度模板化代码的理想替代品,这些代码将多次包含在典型程序中。许多库,最重要的是标准库,都是这样的。但也有许多不同设计的库(小型API+重型二进制后端(。对于这些,我想,我们将不得不像以前一样继续使用include/库。但是,C++是向后兼容的,所以将模块与include混合在一起根本没有问题。
此外,模块可以仅包装包含文件(例如,使用API(。这可能不是一个非常强大的模块使用,但可能会导致更统一的编程模式。在这种情况下,您仍然需要将您的";所以";或";dylib";或任何库。
因此,我相信未来的某个时候会同时分发这两个模块,一些C++模块,还有传统的头文件+库。模块本身可以拆分为许多文件(只有"导出"符号对用户可见(。模块可能会遵循与标头截然不同的设计准则。这很可能不会有任何好处;每个模块一类";,而是";每个模块一整串逻辑连接的代码";。
- 初始化可变数据结构中的共享指针向量
- 在两个结构之间共享数组
- 共享或私有 openmp 代码中的结构化类型变量
- 如何正确使用结构的共享指针成员?
- 多线程和共享资源:使用C++定期将数据从缓冲区(数据结构)复制到文件
- C++共享结构 - 良好做法
- 如何将结构分配给共享内存i C
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 使用Hazelcast替换共享内存结构数据
- 将共享指针指向具有初始化的新结构
- 如何根据目标体系结构将共享库链接到另一个共享库
- 与从C++到C#的内存映射文件共享链式结构
- 在 C++ 和 C# 之间共享内存映射文件结构
- 使用 boost::interprocess 在共享内存中分配用户定义的结构
- 如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
- 在两个文件之间共享C++结构
- 如何在 OOP 程序中共享结构
- 使用内存映射、c++ ERROR_NOT_ENOUGH_MEMORY共享结构
- 可视化 如何在 C++/DirectX 和 HLSL 之间共享结构
- 从c#程序到c++ win32 DLL共享结构体的最佳实践