不同的函數有不同的位址嗎?
在 C 中,通常假設具有不同實現的函數具有不同的位址。然而,在某些情況下,這可能並不總是成立。
函數折疊最佳化
最佳化編譯器可以使用函數折疊將具有相同實現的函數合併到單一實體。這可能會導致函數共享相同的地址。
雖然 C 標準允許實作執行此類最佳化,但仍不清楚是否明確允許函數共用相同的位址。
As-if 規則和 Observable 行為
在 as-if 規則下,編譯器可以最佳化程式碼,如果 observable行為保持不變。獲取函數的地址被認為是可觀察的行為。
標準解釋
缺陷報告 1400 稍微模糊地解決了這個問題。它承認實現可能會別名函數,但對標準的確切解釋留下了爭議。
觀察
有人擔心函數折疊可能會破壞依賴函數的不同位址。例如,如果函數位址被多個函數共享,則使用函數位址作為唯一識別碼可能會出現問題。
C11 要求
C11 標準需要 SIG_DFL 和 SIG_ERR 等宏產生與任何可宣告函數都相等的不同值。這表示 C 標準禁止函數具有相同的位址。
最新進展
gcc 開發人員澄清 MSVC 激進的函數折疊違反了標準。此外,llvm-dev 討論強調,更聰明的連結器會避免組合函數,除非函數僅用於呼叫而不是用於位址觀察。
結論
基於可用信息,目前還不清楚當前的 C 標準是否明確禁止或允許函數折疊優化,從而導致相同的函數共享相同的地址。 as-if 規則為編譯器提供了最佳化的自由,但可觀察的行為(取得函數位址)應該不受影響。但是,建議謹慎,因為函數折疊可能會破壞依賴不同函數位址的程式碼。
以上是不同的 C 函數總是有不同的位址嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!