42 posts
现代 C++ · 性能 · 机器人工程
所有权、数值、并发、接口边界——写机器人代码时真正会绊人的 C++ 细节。
std::expected 跨边界:错误类型膨胀与映射成本
沿库边界拆开错误域映射、异常边界与日志关联,说明为什么随便 map_error 会把诊断信息抹平;给出分层错误模型与可回放的失败路径验收。
C++ 协程的取消与生命周期:悬空 coroutine_handle 从哪里来
沿 promise、awaiter、continuation 和 frame 所有权拆开协程销毁契约;用结构化并发封装,并以等待方先销毁、I/O 晚完成三类竞态验收。
std::pmr 帧级内存池:释放快不等于对象能跨帧活
用 monotonic_buffer_resource 管理帧级临时对象,讲清 memory_resource、upstream、allocator 传播、release 后悬垂、线程边界,以及无堆分配测试与基准方法。
std::jthread 停线程:自动 join 不等于能打断阻塞
用 C++20 stop_token、condition_variable_any 和成员析构顺序,做一条能在关闭时可靠退出的传感器工作线程。
李群小工具的数值卫生:归一化、夹角与阈值
李群/李代数 helper:Exp/Log 数值稳定、小角度近似与 SLAM 状态更新。
ABI 与插件边界:算法库如何安全热插拔
跨 .so 边界时 C API、类型擦除与版本校验怎么落地,以及我踩过的静默崩溃。
Eigen 别名与求值顺序:机器人数值代码的隐形雷
Eigen 表达式模板与 aliasing:何时必须 .eval()、中间临时与 robot 状态更新。
传感器线程模型:无锁队列、背压与实时优先级
采集线程与算法线程边界、有界队列背压、伪共享与优先级反转。
移动语义与流水线:点云/图像缓冲如何少拷一次
移动语义在感知流水线里的接口设计:右值重载、noexcept move 与 loaned message 边界。
所有权与 RAII:机器人 C++ 里最先要钉死的习惯
机器人 C++ 所有权:驱动 fd、GPU buffer、回调生存期与 ASan 落地。
初始化规则:防止意外收窄与未初始化
统一初始化、initializer_list 陷阱与机器人参数 struct 的写法。
头库与二进制库:模板库分发的取舍
头文件库 vs 编译库:迭代速度、编译时间、ABI 与模板暴露的权衡。
机器人 C++ 评审清单:十个高频缺陷
机器人 C++ PR 自检:生命周期、锁、时钟、浮点、ABI 十个高频坑。
错误处理边界:库内与产品边缘策略不同
异常、错误码与 expected 在驱动层/算法层/ROS 节点边界的分工。
剖析热点:从墙钟到火焰图
perf、flamegraph、VTune 找热点:先 end-to-end 再 micro-opt。
类型擦除:跨模块传递异构缓冲
类型擦除 buffer 接口:多传感器格式统一视图而不虚调用每条点。
constexpr 查找表:把不变计算挪到编译期
编译期生成三角函数表、索引表,减少运行时分支与 magic number。
小缓冲优化直觉:短字符串与小向量
SBO 与 `std::function`/短字符串:回调里 hidden 堆分配对延迟的影响。
Eigen::Map:零拷贝映射外部缓冲
Eigen::Map 绑定外部 buffer 的对齐、lifetime 与 aliasing,适配 ROS/传感器零拷贝视图。
只移动队列:帧管道里的所有权传递
只移动类型的有界队列:传感器帧、unique_ptr 缓冲在 pipeline 里的传递。
Sanitizer 与 CI:让内存错误在合并前暴露
ASan/UBSan/TSan 在机器人 CI 里的启用策略,以及和实时路径、第三方库的取舍。
头文件卫生:隐藏实现与编译防火墙
PIMPL、前置声明与模块化拆分的实操,以及机器人单体仓库里怎么少 include 重依赖。
基准测试方法:防优化吞掉你的测量
Google Benchmark 思路、防编译器优化、尾延迟测量,以及机器人 pipeline 里怎么不被均值骗。
单测确定性:随机、时间与文件系统打桩
单测确定性:固定 seed、mock 时钟、避免 flaky 并发测试。
日志级别与结构化字段:能搜才有用
结构化日志、级别策略与热路径里别 LOG_EVERY_N 误伤实时性。
filesystem 与配置加载:路径与原子替换
std::filesystem 加载 YAML/JSON 配置的路径解析、热更新与失败回滚。
chrono:单调时钟与系统时钟别混用
steady_clock 与 system_clock 的分工,传感器时间域对齐,以及超时别用错钟。
浮点陷阱:相等比较、累积误差与确定性
浮点比较、灾难性抵消、NaN 传播与 SLAM 里「小阈值大事故」。
SIMD 入门:从标量循环到可向量化写法
SIMD 入门:对齐、intrinsics 与点云/图像里值得 vectorize 的 loop。
缓存局部性:点云与图像遍历顺序
点云/图像遍历顺序、AoS vs SoA、分块与 perf 测量,减少 cache miss 的实操。
线程池直觉:任务粒度与伪共享
线程池与 work-stealing:感知任务并行化时的队列与粒度。
互斥锁套路:层次锁与死锁避免
锁顺序、std::lock、scoped_lock 与机器人多模块死锁案例。
原子与内存序:传感器标志位怎么同步
memory_order 在传感器标志位与 SPSC 队列里的用法,以及 acquire/release 用错时的隐蔽代价。
variant 与访问器:用代数数据类型表达模式
variant 表达传感器消息多态:visit 模式与状态机。
CRTP:静态接口与零开销扩展点
CRTP 做零开销静态多态:滤波器、积分器策略在热点路径上的用法与代价。
Concepts:给模板参数写出人能读的约束
concepts 约束模板接口:早失败、可读错误与机器人 math 工具。
三/五法则:管理套接字与 DMA 缓冲的类
Rule of Zero/Five:相机句柄、GPU buffer 等资源类的正确写法。
optional / expected:用类型表达可失败结果
std::optional 与 expected/Outcome 表达「可能没有」与「失败原因」。
span 与 string_view:不拥有的视图怎么用才安全
span 与 string_view 作非拥有视图:lifetime 规则与 API 设计。
shared_ptr 成本:何时不该共享所有权
shared_ptr 的原子 refcount 成本与何时该 unique_ptr + 借用。
const 正确性:接口契约比注释更硬
const 与 constexpr 写进类型契约,减少回调里意外改状态和并发误用。
值类别基础:lvalue / rvalue 与表达式结果
值类别与移动:左值/右值/xvalue 怎么影响机器人 pipeline 接口。