函數指標相等與函數合併
問題:
問題:不同的函數可以有相同的函數可以有相同的函數可以有相同的函數可以有相同的函數可以有相同的函數可以有相同的函數可以有相同的函數的值嗎地址?例如, &foo 和 &bar 保證不相等,而 &foo
C 標準允許實現最佳化具有相同定義的函數並將它們合併為單一函數。這意味著兩個這樣的函數的地址可能不相同。
標準合規性:關於函數指標相等的缺陷報告 1400 承認了這種最佳化,但表明它不是明確標準是否需要明確解決這個問題。委員會的回應指出,實現可以在「假設」規則的限制內自由優化。
「假設」規則:下根據「as-if」規則,實作可以模擬可觀察的行為,而無需遵守特定的實作細節。由於函數的位址沒有明確要求不同,因此這種最佳化並不違反規則。
相等運算子:根據標準第 5.10 節,兩個如果指標都是空、指向相同函數或表示同一位址,則它們比較相等。這允許實現將相同的位址分配給兩個具有相同定義的函數。
觀察:Keith Thompson 指出印製 &foo == &bar 的結果是可觀察的行為。透過合併函數更改可觀察的行為可能會破壞此類程式。 此外,
GCC 開發人員 Jan Hubička 確認將相同的函數折疊到相同的位址是不合格行為。它破壞了 GCC 預編譯頭碼中依賴位址比較的某些部分。
結論:雖然標準沒有明確禁止合併相同函數的最佳化,但它重要的是要考慮對依賴不同函數位址的程式碼的潛在影響。實現應謹慎對待這種優化,並在可觀察行為受到影響的情況下避免使用它。以上是不同的 C 函數可以有相同的位址嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!