在 C 中,new 運算子通常用於在堆上分配記憶體。然而,問題就出現了:是否允許編譯器最佳化這些堆記憶體分配。
根據 N3664:澄清記憶體分配,允許編譯器圍繞記憶體進行最佳化分配。這種最佳化是基於「假設」規則,該規則規定,只要結果看起來好像滿足了要求,實作就可以忽略要求。由於 new 可以拋出異常,有些人認為由於其可觀察的行為,它無法被最佳化。
然而,最佳化的支持者認為即使在這種情況下,「假設」規則也適用。他們認為編譯器可以確定分配不會導致異常,省略新呼叫不會違反規則。此外,有人認為編譯器可以證明替換全域運算子 new 不會影響可觀察的行為,從而允許其執行最佳化。
雖然大多數編譯器不會最佳化新的調用,但存在一些例外。例如,Clang 已經實現了後來成為 C 14 一部分的最佳化。但是,在使用 new 的非拋出版本或可以替換運算符 new 的情況下,可能不會執行最佳化。
編譯器最佳化堆記憶體分配的能力是一個複雜的問題,對「as-if」規則的解釋各不相同。雖然某些實作允許在某些條件下進行此類最佳化,但其他實作嚴格遵循標準並且不執行它。
以上是C 編譯器可以使用「new」優化堆記憶體分配嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!