03|Modules(下):实战写个多模块图像处理服务
面向图像的对象存储系统
- 深入了解
- 翻译
- 解释
- 总结
C++ Modules: 现代化的符号可见性控制方案 C++ Modules是C++20标准引入的一项现代化特性,旨在提供更简单、清晰的符号可见性控制方案,并加快编译速度。本文通过实例展示了如何使用C++ Modules来组织项目代码,提高代码的可维护性和可重用性。文章详细介绍了C++ Modules的基本概念和使用方法,并以面向图像的对象存储系统为例进行了演示。C++ Modules解决了传统C++中的符号可见性问题,同时加快了编译速度,但仍存在一些功能限制。文章指出,C++ Modules目前无法解决符号命名冲突和二进制库分发的问题,也暂时无法解决不同编译器之间的ABI问题。尽管存在这些限制,C++ Modules已经成为解决编译性能和符号隔离的重要工具,随着现代C++标准化进程的推进,期待这些问题能够得到更好的支持和解决。总体而言,C++ Modules为C++编程带来了便利性,但仍需要在实际应用中注意其功能限制和适用场景。
《现代 C++20 实战高手课》,新⼈⾸单¥59
全部留言(6)
- 最新
- 精选
- wilby怎么编译这个项目呢?在macOS下没试出来怎么编译
作者回复: 目前来说,对C++20后后续演进标准的支持,Visual C++ 支持最好。macOS默认使用 Xcode 提供的 clang (llvm),此外,gcc、clang对新标准的支持存在一定差异。你可以稍后参考我分享的代码仓库来使用CMake尝试编译(即将提供)。 也欢迎提供反馈,甚至是PR
2023-01-20归属地:瑞典22 - bruceyk老师,请问clang哪个版本能完美支持20所有特性呢?
作者回复: 截止到目前并未完美支持,一般来说编译器也很难实现真正意义上的“完美”支持所有特性(向来如此)。 可以参考 https://clang.llvm.org/cxx_status.html 页面来关注最新的支持状态。
2024-02-28归属地:北京 - Cedric代码中是否存在bug,使用function和vector,map容器的代码编译会报重定义错误注释掉相关代码就可以编译通过了,我的环境是ubuntu22.04,g++13.0.1,不确定是否是对于module的支持的问题还是使用上的问题
作者回复: 到目前为止,gcc对module的支持仍然存在bug,编译错误或编译时core。推荐使用 Visual C++。
2023-02-16归属地:北京 - 浩浩请教老师: 1)文中:“现阶段的 Modules 暂时无法解决各编译器之间 ABI” ,C/C++现今有解决这个问题的方案吗? 2)文中:“二进制库分发的问题”,具体是指二进制库在不同体系结构设备上无法通用吗?
作者回复: 1) C/C++现在还是没有解决这个问题。 2) 指的是二进制库甚至在相同体系结构但采用ABI不同的编译器之间都无法通用。
2023-01-31归属地:广东 - Coding Fattyips 表示什么含义?
作者回复: image processor solution
2023-01-25归属地:辽宁 - peter请教老师几个问题: Q1:cpp文件中怎么会有变量声明? 命令行模块的代码中,argument.cpp中怎么声明了一些字段?:private: std::string _flag; std::string _name; 这些不是应该在.h文件中声明吗? Cpp文件是类的实现文件啊。 Q2:用了module以后就不再有头文件了吗? 文中有一句“新的 C++ Modules 方法,本质上抛弃了“头文件”这种 C/C++ 中的重要组成部分”。采用module以后,不再是“.h + .cpp”这种方式,而时只有.cpp一个文件,对吗? Q3:C80、CA0表示什么? 文中“STL 内存布局问题”部分,图中有“C80、CA0”等内容,是表示CPU类型吗?
作者回复: Q1:我们现在用的是C++ Modules,所以所有文件都是cpp(也就是模块接口或实现),不再有.h的概念了 Q2:这点就是对应Q1,除非引用标准库和特殊用途(比如配置),一般情况下完全不需要有头文件这个概念了,只需要用.cpp即可 Q3:C80和CA0指的是内存地址
2023-01-20归属地:北京