现代 C++20 实战高手课
卢誉声
Autodesk 首席工程师
3781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
现代 C++20 实战高手课
15
15
1.0x
00:00/00:00
登录|注册

03|Modules(下):实战写个多模块图像处理服务

你好,我是卢誉声。
通过前面的学习,我们掌握了模块的基本概念。这节课,我们会一起学习,怎样使用 C++ Modules 来组织实际的项目代码。相信你在动手实战后,就能进一步理解应该如何使用 C++ Modules 和 namespace 来解决现实问题。
掌握了基本概念和使用要点之后,我们也会站在语言设计者的角度,整体讨论一下 C++ Modules 能解决什么问题,不能解决什么问题。
好,话不多说,我们马上进入今天的学习。课程配套代码,点击这里获取。

面向图像的对象存储系统

要写的实例是一个常见的面向图像的对象存储系统,核心功能是将图片存储在本地空间,用户通过 HTTP 请求获取相应的图片,而这个系统的特点是用户除了可以获取原始图片,还可以通过参数获取经过处理的图片,比如图像缩放、图像压缩等。
想实现这样的功能,需要哪些模块呢?
我们画一张系统的模块架构图,可以清晰地看到系统模块以及模块内部分区的依赖关系。
首先我们需要创建项目,项目包括 5 个子模块,分别是 app、cache、command、image、network,其中 app 是业务应用模块,cache 是本地缓存模块,command 是命令行解析模块,image 是图像处理模块,network 是网络服务模块,每个模块分别创建对应的目录存储模块内的源代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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归属地:瑞典
    2
    2
  • 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 Fatty
    ips 表示什么含义?

    作者回复: 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归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部