编译期 AOP: 把横切不变式收进循环骨架
从普通 while 循环里重复出现的心跳上报出发,说明如何用 C++17 函数模板把每轮心跳收进循环骨架,并划清 AOP、模板方法与策略组合的边界。
从普通 while 循环里重复出现的心跳上报出发,说明如何用 C++17 函数模板把每轮心跳收进循环骨架,并划清 AOP、模板方法与策略组合的边界。
以采集模块为例,说明骨架加钩子、策略模板、Traits 注入与函数指针擦除的机制、代价,以及用反汇编和体积对比判断是否真的替代了虚函数。
CRTP 把子类名当模板参数传给基类,让基类在编译期认领自己的子类,从而直接调用并内联,不查虚表、不留 vptr。本文拆解它成立的三条原理、与虚函数的差别、踩坑边界,以及在嵌入式状态机里的落地形态。
PIMPL 是 C++ 中最经典的编译隔离手段,但教科书只展示了 unique_ptr 一种实现。本文对比三种 C++14 兼容的 PIMPL 实现,Heap PIMPL、Fast PIMPL (栈内联)、函数指针表 PIMPL,从编译隔离、运行时成本、缓存友好性三个维度量化分析,给出不同场景的选型依据。
筛选标准: 只保留 C11 在语言层面无法实现的能力。从类型安全、编译期计算、内存安全、类型分发四个维度,逐项对比 C++17 与 C11 的语言级差异,附完整代码对比。
std::shared_ptr 和 std::weak_ptr 在实时系统里会引入原子引用计数、堆碎片化和竞态风险。本文从一个 weak_ptr 竞态 bug 出发拆解五个陷阱,并给出 newosp 的零堆分配替代路径。
传统设计模式依赖虚函数和动态分配,在嵌入式系统中代价偏高。本文以 newosp 真实代码为例,给出 8 种编译期替代手法,覆盖类型擦除、RAII、编译期分发、Tag Dispatch、强类型包装、零堆 Pub/Sub、Visitor 与 CRTP。
结合 MISRA C++ 规范和 newosp 工程实践,说明如何用 C++17 模板做编译期分发,在保留代码灵活性的同时去掉虚函数的分发开销。文中数据来自实测:编译期分发比回调模式快 15 倍,比虚函数分发开销低 95% 以上。
在没有面向对象语法的 C 语言中,策略模式和状态模式都通过函数指针表 (vtable) 模拟多态,代码结构几乎一致。本文从设计意图出发,用通用示例 (传感器滤波、通信协议状态机) 剖析二者的本质差异,并展示它们在同一系统中的协作方式。
以 state_machine 框架的重构为案例,展示如何将一个过程驱动的 C 语言状态机改造为数据驱动的层次状态机 (HSM)。涵盖转换表替代 switch-case、LCA 算法消除递归、用户缓冲区替代内部分配、守卫条件与内外转换区分等关键改造点,附完整数据结构和 API 设计。
面向对象编程(OOP)以其强大的封装、继承和多态特性,成为构建复杂系统的关键范式。然而,在研读 Nginx 和 Linux 内核等高性能 C 语言项目源码时,可以观察到一个显著现象:尽管 C 语言原生不支持 OOP,但其设计架构中却深刻体现了面向对象的思想精髓。