冗余原子写入优化
为什么编译器不会将相同值的连续写入合并到单个原子变量?让我们深入研究这个问题并找出根本原因。
“假设”规则
根据 C 标准,编译器可以合并多个原子写入到单个操作中。即使这些写入涉及不同的值,所产生的行为仍然允许遵守“假设”规则。此规则意味着优化代码的执行与原始写入序列具有相同的可观察效果。
编译器行为与硬件约束
尽管理论上是可能的,实际中编译器一般不会执行这种优化。这样做的主要原因是为了避免在针对真实硬件时对性能和行为产生不良影响。
进度条和其他示例
考虑进度条的示例。优化单个操作的多个原子写入可能会导致进度条保持在 0 然后突然跳到 100%,从而可能会误导用户。这种优化会出现问题的其他场景包括避免循环中无用的shared_ptr引用计数递增和递减。
最小惊喜原则
程序员期望原子写入体现在每个源存储操作的内存。合并多个写入违反了这一期望,导致潜在的混乱和不正确的行为。
实现质量问题
编译器很难确定何时可以安全地优化原子写入不会违反排序规则并影响程序的其他方面。
未来优化和 API 扩展
C 工作组正在进行讨论,以扩展 std::atomic API 并为程序员提供对优化更精细的控制。这将使编译器能够在适当的情况下执行优化,同时确保程序行为的完整性和清晰度。
同时,使用 易失性原子,可以帮助避免不良的优化效果。
以上是为什么编译器不合并连续的原子写入?的详细内容。更多信息请关注PHP中文网其他相关文章!