- 博客(1330)
- 资源 (119)
- 收藏
- 关注
原创 CppCon 2024 学习:To Int or to Uint,This is the Question
两个人都对,但 C++ 的规则让“正确建模”变得危险。int64_t∈[−263,263−1]\text{int64\_t} \in [-2^{63}, 2^{63}-1]int64_t∈[−263,263−1]uint64_t∈[0,264−1]\text{uint64\_t} \in [0, 2^{64}-1]uint64_t∈[0,264−1]即:(a+b) mod 2N(a + b) \bmod 2^N(a+b)mod2N四、逐个分析:signed 版本1⃣ 正常情况如果:
2026-01-04 23:38:15
250
原创 CppCon 2024 学习:This is c++
C++ 的抽象不是为了隐藏机器,而是为了“精准地控制机器”抽象编译期消解零额外成本\text{抽象} + \text{编译期消解} = \text{零额外成本}抽象编译期消解零额外成本为了在除法中“安全地处理除以 0”,并返回一个固定常量(divide_const)你必须付出性能代价指令数量几乎翻倍引入一个条件分支即使你做的是“最简单的除零处理”。表示一种“安全除法”策略:如果分母为 0 →直接返回一个常量值否则 → 正常执行除法fabCb0abb≠0。
2026-01-04 22:04:42
504
原创 CppCon 2024 学习:Template-Less MetaProgramming
一句话定义:逐句解释 是 模板参数包(parameter pack)表示 0 个或多个类型在 TMP 里,这相当于一个 “类型列表”这是一个 别名模板(alias template)等价于:意义:这行代码做了什么?必须是 编译期常量通常是:编译期断言 → 直接编译失败所以这不是“运行时检查”,而是:四、为什么你这里可以写这么多 ?关键原因没有副作用没有执行顺序没有运行成本这就像在写:true∧true∧true\text{
2026-01-04 21:27:52
294
原创 CppCon 2024 学习:Techniques to Optimise Multithreaded Data Building During Game Development
在游戏开发中,Data Building 指的是:本质:包括但不限于:避免磁头来回跳跃Data Building 并不是“有 / 没有”的二元问题,而是一个 连续光谱。构建系统简单开发速度快运行时加载慢内存浪费大问题:优点:绝大多数项目处于:虽然你给的内容还在 BACKGROUND,但它已经隐含了后续重点:游戏世界是以“帧”为基本节奏运行的:帧时间约束(硬指标)60 FPS → 每帧约 16.6 ms16.6\text{ ms}16.6 ms120 FPS → 每帧约 8.3 ms8.3
2026-01-03 17:54:38
801
原创 CppCon 2024 学习:Taming the C++ Filter View
Pipeline of Views 的特点懒惰计算:不生成新的容器组合性:使用管道可以连续应用多个 view类型复杂:底层是嵌套模板视图,C++20 自动推导数学角度理解filter→ 条件集合take/drop→ 序列截取transform→ 函数映射视图是懒惰的:不生成新容器,只创建一个“筛选窗口”引用修改:管道可以直接修改原容器的元素组合灵活:可以和transform等视图组合,实现更复杂的操作Views 是懒惰的不产生新容器只有在迭代访问时才计算结果组合操作v2f∘。
2025-12-26 20:44:59
543
原创 CppCon 2024 学习:SuperCharge Your IPC Programs With C++20 and CCI Pattern
图片在不同应用中广泛使用我们希望提取图片的颜色通道,例如 R/G/B 通道提供一个服务接口,让客户端通过通信端点(IPC)调用通道提取功能输入:图像数据输出:分离的通道数据通信:使用 IPC(如 dbus)作为服务端和客户端的桥梁公式化表示:假设图像III大小为H×W×3H×W×3IRGBRGB∈RH×WIRGBRGB∈RH×WfIRGBfIRGB使用CCI 模式组织服务:Contract。
2025-12-26 16:43:04
840
原创 CppCon 2024 学习:spanny Rise of std:mdspan
很多人只知道:但真正复杂与强大的地方在于:mdspan 的真正价值在于“可扩展映射”这一部分是内容路线图。layout 是一个纯函数对象:f(i0,i1,…,in)→offsetf(i_0, i_1, \dots, i_n) \rightarrow \text{offset}f(i0,i1,…,in)→offset但标准要求:(i,j)→(j,N−1−i)(i, j) \rightarrow (j, N - 1 - i)(i,j)→(j,N−1−i)这意味着:这和你前面学到的 hash
2025-12-26 16:13:01
691
原创 CppCon 2024 学习:So You Think You Can Hash
核心不是“介绍某个具体哈希算法”,而是:哈希在以下场景中是性能瓶颈级别的基础设施:问题是:问题:使用方式(带注释)正确但问题还没解决完2⃣ 类型只“暴露结构”,不关心算法类型作者只写一次4⃣ 使用方式八、Benchmark 与实验(Presentation 的另一重点)你可以做什么?在同一组数据上:测量冲突率测量吞吐量测量 cache 行为对比:boost-styleFNV-1axxHashCityHash自己的新算法不改类型代码九、这套
2025-12-26 14:00:06
1023
原创 CppCon 2024 学习:Shared Libraries and Where to Find Them
通过加上-fPIC,你应该能够解决该问题,并成功编译共享库。编译时需要确保链接器能够找到并链接到共享库。通过使用-L和-l选项,你可以正确指定库的位置并完成链接。这样,你就能成功编译并运行你的程序了。通过g++ -v编译器选项和版本:显示了使用的编译器及其配置选项。路径和库查找:显示了编译器查找头文件和库文件的路径。工具链过程:从预处理、编译、汇编到链接的详细步骤。安全性和优化:编译器启用了安全性选项(如堆栈保护)和一些优化选项。ELF 可执行文件。
2025-12-26 10:45:22
750
原创 CppCon 2024 学习:Sender Patterns to Wrangle Sender Patterns to Wrangle Concurrency in Embedded Devic
这不是“条件”,而是 不可违背的公理。并发错误的代价:error⇒system stuck forever\text{error} \Rightarrow \text{system stuck forever}error⇒system stuck forever异常 ≠ 控制流状态 = 数据4⃣ 没有 RTOS(no scheduler)理解没有任务隔离没有抢占管理所有并发都靠约定并发模型只有两种:主循环中断三、STM32L432KC:并发来源的“实体化”1⃣ GPI
2025-12-25 16:24:28
900
原创 CppCon 2024 学习:Security Beyond Memory Safety Using Modern C++ to Avoid Vulnerabilities by Design
在 2019–2023 连续 5 年 的 CWE Top 25 中:对应 CWE:对应 CWE:对应 CWE:官方特别指出一个容易被忽视的信号:不是因为“大家突然变聪明了”,而是:你给的材料里,Rust 是唯一一个完整出现的“语言级解决方案”。而是:你材料里接着给了 C++ 的几条改进路线,这非常关键。不是语言规则,而是:它们解决的是:解决的是:你提到的这篇提案非常重要。编译器假设它“不可能发生”优化阶段产生灾难性行为这是 C++ 内存模型的历史包袱六、为什么会出现 Carbon / Cpp
2025-12-25 12:51:03
996
原创 CppCon 2024 学习:Relocation: Blazing Fast Save And Restore, Then More!
实体-组件系统通过将传统的面向对象编程中的对象和类转化为“实体”和“组件”的方式,优化了性能并简化了数据管理。通过将不同类型的组件存储为同质数据的数组(而不是传统的面向对象的异构结构),可以显著提高数据访问的局部性,从而提高性能。在传统的面向对象编程中,我们通常会使用包含多个异构类型成员的结构体或类,然而,这种设计方式存在一定的性能问题,特别是在大规模数据处理时。在ECS中,实体和组件之间的绑定是通过句柄来实现的。在这种方式下,每个结构体的实例包含多个不同类型的成员,它们通常存储在内存中连续的内存区域中。
2025-12-24 17:58:11
784
原创 CppCon 2024 学习:Reflection Is Not Contemplation
这段代码通过模板函数min展示了如何进行类型推导和类型转换,涵盖了整数类型、字符类型、以及自定义类型的比较。它同时还展示了如何处理一些 C++ 特性,如引用折叠、和类型特性检查。C++ 中的身份(Identity)函数与其应用在 C++ 中,身份函数的概念是非常基础且有用的。它不仅用于函数实现,还在很多 C++20 标准库中得到了应用。下面是一些示例和解释,展示如何在 C++ 中使用和理解身份。min函数模板 - 具有静态断言的最小值计算// 使用静态断言,避免不安全的比较。
2025-12-24 17:23:13
542
原创 CppCon 2024 学习:Reflection based libraries to look forward to
虽然 C++ 本身没有内建的反射机制,但通过一些标准库(如 Boost)和编译时技巧,我们可以模拟反射的功能。C++20 提供的P2996提案(即未来的反射标准)将为 C++ 提供更加完善的反射支持,允许开发者在运行时访问和操作类型信息,带来更多的灵活性和动态性。反射是一种能力,可以在运行时访问类型的详细信息(如类、结构体的成员、方法等),并且能够对这些信息进行操作。通过反射,程序能够在运行时检查和修改对象的结构。这种特性通常用于动态编程中,特别是在需要操作类型信息、方法、字段的应用中。
2025-12-24 16:56:42
641
原创 CppCon 2024 学习:Performance Engineering A gentle introduction to hardware for software engineers
HBM的带宽性能受限于命令流的密集程度,而不是简单的通道宽度。远程内存提供了跨节点内存共享的能力,但需要高代价来保持一致性,尤其是在涉及到缓存一致性和地址空间时。非易失性内存主要用于调试和数据持久化存储,尤其适用于需要持久性存储的数据。内存地址映射设计在确保内存高效利用的同时,也要考虑到一致性和控制开销的问题。内存配置的不同会直接影响系统的带宽和延迟性能。不同的页面大小行和列地址范围Bank组数量等因素都会在性能上产生显著差异。内存地址映射。
2025-12-24 15:39:28
650
原创 CppCon 2024 学习:Newer Isn’t Always Better Investigating Legacy Design Trends and Their Modern Repla
原始趋势:索引 For 循环优点灵活性高,可以访问元素的索引和进行复杂计算。可以用于更复杂的操作,例如修改数组元素的值、计算某个元素的指标等。缺点易出错,容易发生越界错误。代码可读性差,尤其在处理复杂数据时。新趋势:基于范围的 For 循环优点更加简洁,代码更具可读性。自动处理元素的遍历,减少了手动管理索引的麻烦。更安全,避免了越界访问。缺点无法直接访问元素的索引,因此在某些情况下无法进行基于索引的操作。全局接口。
2025-12-24 10:41:54
788
原创 CppCon 2024 学习:Multi Producer, Multi Consumer, Lock Free, Atomic Queue User APl and Implementation
理解:下面是一个简化版 C++ MPMC 队列示例,带注释:注释解析哑节点 (dummy node)用于简化边界条件处理, 和 都指向哑节点开始。数学上可以理解为:head=tail=Node0\text{head} = \text{tail} = \text{Node}_0head=tail=Node0原子操作 (atomic) 保证在多线程环境下队尾更新不会产生数据竞争。atomic_exchange\text{atomic\_exchange}atomic_exchang
2025-12-23 22:34:43
790
原创 CppCon 2024 学习:Monadic Operations in Modern C++: A Practical Approach
箭头方向<---表示模块依赖库--->表示模块输出到 Bundle等价图解Library 1⟵Module 2⟶Bundle 1Library 1⟵Module 2⟶Bundle 1Library 2⟵Module 2⟶Bundle 1Library 2⟵Module 2⟶Bundle 1Library 1⟵Module 3Library 1⟵Module 3内部框架层次模块组合库,捆绑包组合模块UI 子系统职责。
2025-12-23 17:03:51
988
原创 CppCon 2024 学习:Error Handling Modern C++
2⃣ 调用示例(展示“语义陷阱”)这里隐藏的问题 和 返回相同结果 和 返回相同结果调用者无法判断是否发生了解析错误3⃣ (严格校验,但与 语义不一致)4⃣ 两个函数放在一起的语义冲突核心问题 接受的 Domain 是:[0−9]∗[0-9]^*[0−9]∗ 实际处理的是:[0−9]∗的前缀[0-9]^* \text{的前缀}[0−9]∗的前缀1⃣ 函数定义接口语义(从代码而不是名字推断): 是累积器(accumulator)初始值为 0
2025-12-23 14:39:10
961
原创 CppCon 2024 学习:Mix Assertion, Logging, Unit Testing and Fuzzing with ZeroErr
在 C++ 中,打印一个对象通常意味着:但这在现实工程中会遇到四重困难。问题:➡ 还算可控,但工作量开始出现问题升级了:这里的问题是语义问题:这意味着:这是最棘手的一类:而是:比如:你需要支持:这正是 C++ 项目中日志系统最常见、最隐蔽的复杂度来源之一。你给出的代码是很多真实项目的现状:从“局部”看,一切都合理:你并不是只打印 ,你在打印:看这两行:这意味着什么?问题:问题升级:这是语义雷区:这意味着:这是最糟的情况:如果你有:你需要支持的打印组合数接近:O(类型数×包装
2025-12-23 12:09:26
1032
原创 CppCon 2024 学习:Message Handling with Boolean Algebra
字段是消息的基本组成单位,每个字段通常包含以下几个信息:假设有一个 32 位消息字 WWW,定义如下位域:W=[31…0](bit 31 为最高位, bit 0 为最低位)W = [31 \dots 0] \quad \text{(bit 31 为最高位, bit 0 为最低位)}W=[31…0](bit 31 为最高位, bit 0 为最低位)如果有一个字段 位于第 0 个字的第 5~2 位,则:IPv4 头部是网络层协议中每个 IP 包的开头部分,用于控制和标识数据包。它由固定长度的 5 个字
2025-12-21 21:12:49
969
原创 CppCon 2024 学习:Many Ways to Kill an Orc (or a Hero)
我们的游戏程序员和游戏引擎,经常会涉及到英雄与敌人之间的战斗。这是一个情境设定,并不是技术点本身,而是为后面的内容服务。表达英雄和怪物互相战斗,传统上(classical / traditional)已经有很多常见、固定的写法。但是——C++ 是一门表达能力非常强、非常灵活的语言。这里的“classical”暗指:而随着 C++20 / C++23 的到来,英雄和怪物“互相攻击”的实现方式变得更多了。这是一个明显的铺垫,暗示后面会涉及:到现在为止,你可能在想:……所以,不,这其实并不是这场演讲
2025-12-21 16:25:48
837
原创 CppCon 2024 学习:LLVM‘s Realtime Safety Revolution: Tools for Modern Mission Critical Systems
实时程序是指 必须在规定时间约束内给出响应 的软件系统。这个时间约束通常被称为 “截止时间”(deadline)。实时系统关注的不是单纯的“计算正确”,而是 “计算正确且在正确时间内完成”。公式上可以概括为:任务成功 ⟺ (输出正确)∧(完成时间≤截止时间)\text{任务成功} \iff (\text{输出正确}) \wedge (\text{完成时间} \le \text{截止时间})任务成功⟺(输出正确)∧(完成时间≤截止时间) 和 是实时任务函数。关键点:函数必须在规定的截止时间
2025-12-20 23:15:05
683
原创 CppCon 2024 学习:Linear Algebra with The Eigen C++ Library
这次演讲关注的是:它实现了经典 BLAS 的核心部分:明显的局限没有线性方程求解器没有矩阵分解LUQRCholesky用户仍需“自己动手”性能评价还不错(Good)但谈不上顶尖(not outstanding)现实结局2008 年之后几乎没有重大更新uBLAS FAQ 里明确承认:技术路线已被更新的库超越四、“下一代”线性代数库(2006 – 2012)随着 C++ 模板技术成熟,一批现代库出现了。目的只有一个:编译器会生成融合后的表达式,避免中间临时
2025-12-20 17:35:36
727
原创 CppCon 2024 学习:Limitations and Problems in std:function and Similar Mitigations and Alternatives
Host App 是:这是示意:这是一个非常重要但容易被忽略的角色:你看到每个 Provider 都有:这是系统的**“不可替换内核”**:这条箭头非常关键:因为:左右两侧的箭头表示:综合来看,这是:这是一个不返回值、但通过回调报告结果的初始化函数。用形式化一点的方式表示:initialize:(S,Qs,Qb,Qn,C)→∅\text{initialize} : (S, Q_s, Q_b, Q_n, C) \rightarrow \varnothinginitialize:(S,Qs,Qb,
2025-12-19 23:11:50
1014
原创 CppCon 2024 学习:Leveraging C++20/23 Features for Low Level Interactions
在一个裸机(bare-metal)环境下,我们要展示C++ 的高效使用方法。为什么硬件交互(HW interactions)常用 C 语言?历史原因:C 语言自 1970s 以来一直被用于系统编程和嵌入式开发。硬件厂商提供的寄存器访问库、启动代码(startup code)、中断向量表等,几乎都基于 C。特性匹配:C 语言提供低开销、可预测的内存布局,适合直接操作硬件寄存器。REG320x01;REG320x01;编译器支持。
2025-12-15 22:34:27
577
原创 CppCon 2024 学习:Interesting Upcoming Features from Low Latency, Parallelism and Concurrency
在多线程程序中,经常会出现这样的需求:如果用普通变量或非原子更新:在并发下会出现:虽然 能解决正确性问题,但:Atomic min / max 在以下领域非常常见:2⃣ 返回值语义(非常重要)与 一致:标准还会提供:四、内存序(memory_order)语义默认版本等价于:显式版本的使用原则统计 / reduction→ 同步 / 发布语义→ / 数学上可以理解为:atomicity;≠;ordering\text{atomicity} ;\neq; \text{ord
2025-12-15 20:57:41
1025
原创 CppCon 2024 学习:Implementing Reflection Using the New C++20 Tooling Opportunity: Modules
**反射(Reflection)**是指:你 不能:这类能力就是反射。反射解决的是一个核心问题:每个结构体都要手写字段一多就容易出错(2)通用算法失效你想写一个函数:没有反射,你根本不知道:(2)ORM / RPC / 自动绑定(3)调试 / 日志 / 可视化(4)脚本语言 / 配置系统2.4 数学角度的抽象(为什么“通用”)可以把一个对象抽象成:Object=(n1,v1),(n2,v2),…,(nk,vk)\text{Object} = {(n_1, v_1), (
2025-12-15 16:34:01
917
原创 CppCon 2024 学习:Implementing Particle Filters With Ranges
Transition model Observation model Prediction Update bel(X t-1) bel(X t) 1⃣ 问题背景Bayesian Filters 用来解决这样一类问题:我们通常定义:贝叶斯滤波的目标不是“一个值”,而是一个概率分布:bel(Xt)=p(Xt∣Z1:t)bel(X_t) = p(X_t \mid Z_{
2025-12-15 13:31:19
609
原创 CppCon 2024 学习:How Meta Made Debugging Async Code Easier with Coroutines and Senders
特性传统异步栈改进异步栈线程边界有,显示线程局部栈跨线程,按逻辑顺序显示可读性低,需要手动合并高,一条连续栈调试便利性异常难追踪异常可直接定位数学类比分段函数fitf_i(t)fit拼接函数FtF(t)Ft核心理解传统栈是“线程切片”,改进栈是“逻辑展开”,它把异步操作的调用链抽象成一条连续的路径,使调试和理解流程直观化。所有子任务都在父协程的co_await下完成。主协程async_main会等待所有任务完成。
2025-12-13 13:48:54
925
原创 CppCon 2024 学习:High-Performance Cross-Platform Architecture: C++20 Innovations
这是典型的 C 风格实现,以数据驱动类型判断()来实现多态。问题在于:扩展困难(添加新形状需要修改已有函数)类型不安全行为与数据分离在 C++ 中,OCP 可以通过继承 + 虚函数或概念 + 模板来改进,避免修改已有代码,只通过扩展新类或新模板实现新的形状。特性C 风格C++ 多态风格数据与行为分离封装在类里类型安全不安全,需要 cast安全,虚函数多态扩展性需修改 switch-case只需新增类遵守 OCP否是可维护性差好。
2025-12-12 14:39:46
731
原创 CppCon 2024 学习:Hiding your Implementation Details
信息隐藏是软件工程的核心原则之一,但在实际开发中很难落实。指出软件工程教育标准普遍低于其他工程学科,因此开发者常常难以正确应用信息隐藏。此外,还有一些常见原因导致信息隐藏失败:信息隐藏失败的原因大致可以归纳为:隐藏实现细节是软件设计的重要原则,但实际中很难完全做到。原因大致分为四类:尽管存在其他安全的访问方法,但直接访问 和 仍然暴露了私有字段。核心思想:懒惰 + 时间压力⇒直接暴露实现细节\text{懒惰 + 时间压力} \Rightarrow \text{直接暴露实现细节}懒惰 + 时间
2025-12-12 14:02:06
661
原创 CppCon 2024 学习:Hidden Overhead of a Function API
很多人谈性能时,只想着:原因与现代 CPU、编译器、动态指令执行、代码体积密切相关。要说明几个事实:低层级的小函数 benchmark:动态指令计数意味着:为了更纯粹检查设计影响:引用 BOLT 的研究:而函数 API 设计不佳(例如:因为 inline 会使:引用 ISO C++ wiki 的观点:引用 Firefox:这一整段内容要传达:这一段的核心主题是:C++ 标准只规定:机器码生成不会只看 C++ 标准。流程类似:因此,不同平台的 C++ 程序之间:每种组合都会生成不同的机器码格式。作者强调
2025-12-12 11:01:50
590
原创 CppCon 2024 学习:Gazing Beyond Reflection for C++26
语法域(syntactic domain)描述代码的形状、类型、模板等。^^或[:...:]^^stdvectorintrXtemplateqint^^std::vectorintr::Xtemplateqint计算域(computational/meta domain)对语法对象进行分析、替换、生成新类型或对象。常见操作:rrT↦intdeviceMega^^Ve。
2025-12-11 22:55:07
574
原创 CppCon 2024 学习:Fast and small C++ Whenefficiency matters
代码中提到的./a.out是在类 Unix 系统中执行可执行文件的常见命令。<string>头文件提供了类,使得程序能够轻松操作字符串。[[xyz]]是一种 C++ 属性的语法,它允许在代码中添加编译器指令,影响程序的编译行为或其他特性。这段代码展示了如何利用和技术来高效地管理资源,确保内存和文件管理的高效性。断言用于确保f的内存大小等于两个指针的大小,验证压缩对的效果。空基类优化这段代码演示了空基类优化(EBO)技术的使用。在派生类Derived中,尽管继承了一个空的基类Base。
2025-12-11 21:54:20
518
原创 CppCon 2024 学习:Designing a Slimmer Vector of Variants
该图形是一个简化的内存布局示意,帮助理解在内存中的分布方式,尤其是堆与栈的分配。栈区存储的元数据,而堆区存储具体的数据元素,并且通过指针关联两者。的设计虽然灵活,但由于它为最大类型分配内存,导致了内存的浪费。假设所有元素大小相同,这也加剧了内存开销。在实际使用中,尽管我们期望的内存需求较低,但由于这些类型的内存对齐和容器实现,导致了大规模的内存膨胀(540倍)。vector。
2025-12-11 17:50:55
761
原创 CppCon 2024 学习: Design Patterns The Most Common Misconceptions (2 of N)
讨论集中在设计模式、虚拟函数以及如何优化继承层次结构的开销。以下是对CRTP(Curiously Recurring Template Pattern)和的详细分析。在面向对象编程中,继承层次结构的使用通常会引入虚拟函数,从而产生运行时多态性的开销。主要有以下几个问题:我们来看这两段代码和它们的输出,详细分析背后的原理。输出:输出解释在这段代码中,我们有一个 类和一个继承自它的 类。输出:输出解释 输出:这次 仍然是 类中的方法,但与第一段代码的不同之处在于 类的 方法是一
2025-12-11 16:09:12
906
原创 CppCon 2024 学习: Dependency Injection in C++ A Practical Guide(续)
Lazy Initialization(懒加载)目标:延迟创建DBHelper,直到第一次真正使用。优点:节省启动/构造开销。缺点:无法通过依赖注入(DI)提供已构建对象。注意:本示例未正确赋值给db_helper_,懒加载不完整。依赖注入(DI)对比如果想做依赖注入或者通过:传入典型问题内部依赖工厂创建 → 违反 “控制反转(IoC)” 原则。测试困难:无法传入 MockDBHelper,只能依赖真实创建逻辑。是 C++20 的 concept,用于约束模板参数类型。要求。
2025-12-11 11:54:34
914
原创 CppCon 2024 学习: Dependency Injection in C++ A Practical Guide
理解:在传统设计中,一个类或函数通常会直接创建或依赖另一个类,这会造成强耦合(tight coupling)。例如:这种设计中, 和 紧密绑定在一起,如果 改变, 也必须修改。依赖注入的做法:将依赖作为参数传入或通过框架注入,降低耦合度:数学形式化表示:假设一个函数或类 FFF 依赖某个组件 DDD,原设计中:F=f(D)F = f(D)F=f(D)其中 FFF 内部直接创建或调用 DDD,耦合度高。使用依赖注入后,DDD 由外部传入:F(D)=f(D),D由外部注入F(D) =
2025-12-11 11:53:15
1017
Real-Time C++, 2nd Edition.pdf
2018-06-17
OpenGL ES 3dot0 Cookbook
2018-06-17
OpenCV 3 Blueprints.pdf
2018-06-17
Data Structures & Algorithm Analysis in C++, 4th Edition.pdf
2018-06-17
Learning Boost C++ Libraries.pdf
2018-06-17
OpenCV Computer Vision with Python.pdf
2018-06-17
OpenGL 4 Shading Language Cookbook, Second Edition
2018-06-17
OpenGL Data Visualization Cookbook
2018-06-17
A Practical Introduction to Computer Vision with OpenCV.pdf
2018-06-17
Functional Programming with C++
2018-06-17
Procedural Content Generation for C++ Game Development.pdf
2018-06-17
OpenGL Programming Guide, 8th Edition
2018-06-17
Arduino Computer Vision Programming.pdf
2018-06-17
OpenCV Computer Vision Application Programming Cookbook Second Edition.pdf
2018-06-17
OpenCV 2 Computer Vision Application Programming Cookbook
2018-06-17
Learning Image Processing with OpenCV.pdf
2018-06-17
Practical Algorithms for 3D Computer Graphics, Second Edition.pdf
2018-06-17
Game Programming Using QT.pdf
2018-06-17
Multicore and GPU Programming An Integrated Approach.pdf
2019-03-21
OGLPG-9th-Edition.zip OpenGL编程指南代码(包括资源文件)
2019-10-23
OpenGL 4.5 Reference Pages API + GLSLangSpec.4.60 + glspec46.core
2019-10-22
OGRE 3D 1.7 Application Development Cookbook.pdf
2019-04-20
UNIX网络编程卷1:套接字联网API(第3版) (1).pdf
2019-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅