堆記憶體分配的編譯器最佳化
編譯器是否可以最佳化堆記憶體分配的問題源自於對某些編譯器執行的觀察這種優化,而其他則沒有。特別是,clang 3.0 及更高版本優化了以下程式碼中的新呼叫:
int main() { int* mem = new int[100]; return 0; }
,而 g 和 Visual Studio 則沒有。這引起了人們的擔憂,即此類最佳化可能違反 as-if 規則,該規則要求編譯器產生可觀察的行為,就像遵循了標準一樣。
Clang 最佳化和 As-if 規則
clang 最佳化的歷史揭示了其有效性。 Clang 的最佳化遵循 N3664,它允許進行此類最佳化。然而,這個決定的因果關係仍然值得懷疑。
或者,as-if 規則可以被解釋為禁止這樣的最佳化,因為 new 可以拋出異常,這會影響可觀察的行為。但是,clang 可能會認為這是一個實作細節,並且它已確定不會引發異常。
Non-Throwing Operator New
The argument for最佳化對非拋出版本的呼叫在 as-if 規則下也是有效的。但是,如果存在替換全域運算符 new,則最佳化可能會違反假設規則。 Clang 之前過於激進的優化,甚至優化了 create() 調用,在後續版本中得到了糾正。
結論
編譯器優化堆疊記憶體分配的能力仍然是一個問題辯論的主題,對假設規則和程式碼行為具有潛在影響。雖然 N3664 允許 clang 的最佳化,但一些論點表明它在某些情況下可能會違反假設規則。對於開發人員來說,了解這些微妙之處並考慮此類最佳化的可觀察後果至關重要。
以上是編譯器可以在不違反假設規則的情況下最佳化堆記憶體分配嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!