首頁 >後端開發 >C++ >編譯器可以優化掉 C 中的「新」呼叫嗎?

編譯器可以優化掉 C 中的「新」呼叫嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-02 00:19:15703瀏覽

Can Compilers Optimize Away `new` Calls in C  ?

編譯器可以消除堆記憶體分配嗎?

在 C 中,new 運算子用於在堆疊上分配記憶體。編譯器可以最佳化程式碼,包括刪除不必要的語句。編譯器可以消除使用 new 進行的堆記憶體分配嗎?

編譯器行為

研究顯示不同的編譯器以不同方式處理堆分配:

  • g (5.2.0) 和Visual Studio 2015 不會最佳化新的呼叫。
  • clang (3.0 ) 最佳化新調用,即使具有完整的最佳化標誌。

最佳化的有效性

有效性編譯器最佳化是一個有爭議的議題。有些人認為編譯器不允許最佳化新調用,因為它們可能具有可觀察到的行為(例如拋出異常)。其他人認為,如果編譯器可以保證不會影響任何可觀察的行為,則允許最佳化新呼叫。

C 14 標準

N3664:澄清記憶體分配澄清了有關編譯器最佳化和記憶體分配的規則。它允許編譯器在某些情況下優化記憶體分配。然而,該條款受到批評,因為它可能違反因果關係。

其他注意事項

  • 不拋出新:Clang 也進行了最佳化out 呼叫非拋出 new運算子。
  • 重寫的運算子 new:不同翻譯單元中的自訂全域運算子 new 實作可能會影響與堆疊分配相關的編譯器最佳化的有效性。

結論

編譯器最佳化堆記憶體分配的能力是一個複雜的問題涉及編譯器行為、語言標準和潛在的異常。雖然一些編譯器基於 N3664 實現了這種最佳化,但其有效性仍然是一個討論的主題,並且取決於具體情況,包括 C 標準和自訂記憶體分配器的存在。

以上是編譯器可以優化掉 C 中的「新」呼叫嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn