C++ 缓存行布局:先减少共享写,再谈微优化
背景 两个线程更新不同计数器,逻辑上没有共享数据,却可能争用同一缓存行。伪共享是布局问题,不是原子变量失效。 核心判断 先确认热点来自并发写和缓存一致性开销。 按写入者划分数据,必要时使用每线程计数后聚合。 只有测量支持时才增加对齐或 padding。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 struct alignas(64) Counter { std::atomic<std::uint64_t> value{0}; }; struct Metrics { Counter accepted; Counter rejected; }; 边界与误区 64 字节只是示例假设,不是所有硬件的保证。过度 padding 会增加工作集,读多写少的数据可能因此更慢。 验证方式 固定线程数、CPU 亲和性和操作次数,对比吞吐及缓存相关事件。保留真实业务基准,不用单一空循环决定结构布局。 小结 高频并发写字段要避免伪共享,但任何 padding 都必须由 profile 证明收益。