原子变量写入的优化挑战
尽管 C 标准中的“as-if”规则允许将重复写入合并到相同的原子变量,编译器通常不会执行此操作优化。
编译器限制的原因
主要关注的是预期行为的潜在破坏。程序员希望原子存储单独发生,从而保留潜在竞争条件的中间值的可见性。合并存储可能会违反此期望,特别是在进度条等需要立即更新的场景中。
标准含义
C 标准允许折叠多个写入到单个原子变量,即使存储不同的值。这表明编译器可以合并多个写入以提高性能。然而,原子操作的“假设”性质使其对实现决策开放,编译器选择了谨慎的方法来避免意外行为。
优化案例
尽管存在潜在的陷阱,但仍有优化原子写入的合法用例。例如,减少循环中不必要的引用计数操作可以提高性能。为了解决这个问题,C 工作组正在考虑扩展原子 API 以提供对优化的显式控制。
易失性原子变量
使用易失性原子变量可以防止合并的写入。虽然 易失性 并没有明确禁止合并,但它限制了优化并保持了各个写入的一致性。然而,它也可能会带来不必要的开销,因此不鼓励将其作为防止合并的主要方法。
正在进行的讨论
C 工作组内的讨论正在探索启用的方法编译器在适当的时候安全地优化原子写入。这包括选择加入语法或注释的建议,以指示何时需要优化以及何时应避免优化。
在标准中达成并实现共识之前,编译器可能会继续避免将原子写入合并到保持可预测性并符合程序员的期望。
以上是为什么 C 编译器不优化重复的原子变量写入?的详细内容。更多信息请关注PHP中文网其他相关文章!