編譯器可以消除堆記憶體分配嗎?
在 C 中,new 運算子用於在堆疊上分配記憶體。編譯器可以最佳化程式碼,包括刪除不必要的語句。編譯器可以消除使用 new 進行的堆記憶體分配嗎?
編譯器行為
研究顯示不同的編譯器以不同方式處理堆分配:
最佳化的有效性
有效性編譯器最佳化是一個有爭議的議題。有些人認為編譯器不允許最佳化新調用,因為它們可能具有可觀察到的行為(例如拋出異常)。其他人認為,如果編譯器可以保證不會影響任何可觀察的行為,則允許最佳化新呼叫。
C 14 標準
N3664:澄清記憶體分配澄清了有關編譯器最佳化和記憶體分配的規則。它允許編譯器在某些情況下優化記憶體分配。然而,該條款受到批評,因為它可能違反因果關係。
其他注意事項
結論
編譯器最佳化堆記憶體分配的能力是一個複雜的問題涉及編譯器行為、語言標準和潛在的異常。雖然一些編譯器基於 N3664 實現了這種最佳化,但其有效性仍然是一個討論的主題,並且取決於具體情況,包括 C 標準和自訂記憶體分配器的存在。
以上是編譯器可以優化掉 C 中的「新」呼叫嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!