首頁 > 後端開發 > C++ > 為什麼編譯器不合併相同值的冗餘原子寫入?

為什麼編譯器不合併相同值的冗餘原子寫入?

Susan Sarandon
發布: 2024-12-15 21:35:15
原創
366 人瀏覽過

Why Don't Compilers Merge Redundant Atomic Writes of the Same Value?

為什麼編譯器避免合併冗餘原子寫入

簡介

簡介
std::atomic<int> y(0);
void f() {
  auto order = std::memory_order_relaxed;
  y.store(1, order);
  y.store(1, order);
  y.store(1, order);
}
登入後複製

編譯器通常編譯器堅持「 as-if」規則,讓他們在可觀察到的情況下重新排序操作行為保持一致。然而,在連續儲存具有相同值的原子變數的情況下,例如:

編譯器傾向於單獨發出寫入。

C 的限制標準

雖然C 11 和C 14 標準在技術上允許合併三個商店,它們不保證觀察者會看到2 的中間值。因此,透過將儲存摺疊到單一操作中進行最佳化將違反標準允許任何有效排序的意圖。

編譯器注意事項

編譯器優先考慮最佳化效能而不是可預測性,這導致了保守的方法。儘管標準允許,但編譯器選擇不合併原子寫入以避免潛在問題,例如當多個儲存錯誤合併時進度條會卡住。

最小驚喜原則

程式設計師通常期望原子儲存依序發生,每個儲存都以寫入的方式執行。如果編譯器要合併這些操作,則可能會引入意外行為並違反最小意外原則。

即將推出的 API 增強

C 工作小組正在進行討論使用額外的最佳化控制來擴展 std::atomic API。這將允許編譯器在不違反排序要求的情況下最佳化原子寫入。

替代解決方案

同時,程式設計師可以使用易失性原子變數來防止商店最佳化。雖然此方法主要解決進度條問題,但它不是理想的長期解決方案。

結論編譯器通常不會將連續的原子寫入與相同的原子寫入合併值以確保與C 標準的一致性,避免潛在的性能問題,並堅持最少意外原則。然而,未來的 API 增強可能使編譯器能夠在未來安全地實現此最佳化。

以上是為什麼編譯器不合併相同值的冗餘原子寫入?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板