首頁 >後端開發 >C++ >不同的 C 函數是否始終具有不同的函數指標位址?

不同的 C 函數是否始終具有不同的函數指標位址?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-01 22:39:19583瀏覽

Do Distinct C   Functions Always Have Distinct Function Pointer Addresses?

函數指標相等且不同位址

問題:

在C 中,是函數指針對於保證具有不同位址的不同函數?具體來說,對於以下程式碼:

&foo != &bar 和 &foo 是? != &foo;保證為真?

答案:

標準沒有明確要求不同函數的函數指標具有不同的位址。但是,它確實允許實現最佳化具有相同定義的函數,並且這種最佳化可能會導致相同的函數位址。

事實上,Microsoft Visual C (MSVC) 積極折疊具有相同實作的函數,為它們分配相同的位址。這種行為被認為是不合格的。

另一方面,Gold 連結器提供了更安全的設置,可以為函數維護不同的位址,即使它們具有相同的定義。

詳細解釋:

C 標準將函數指標的相等性定義為如下所示:

  • 如果兩個函數指標指向同一個函數,則它們比較相等。
  • 或者,如果兩個函數指標代表相同的位址,它們也被認為是相等的。

後一個條件為實現別名不同的函數提供了自由度,並且沒有明確要求指向不同函數的指標不相等。

但是,取得函數的位址是可觀察的行為,更改位址可能會違反「as-if」規則。此規則要求實現的行為與標準中指定的行為無法區分。

因此,雖然標準沒有明確禁止函數位址別名,但可以說它違反了「as-if」規則,導致不合格

觀察:

  • 更改函數位址可能會破壞依賴唯一函數位址的程序,例如使用函數指標作為唯一值的程序。
  • 一些連結器,包括 Gold 和 LLVM 的 lld,僅在以下情況下才會執行避免有問題的位址別名的最佳化:

結論:

雖然標準允許函數位址別名,但通常建議避免這種最佳化,因為它會產生可移植性和可靠性問題.

以上是不同的 C 函數是否始終具有不同的函數指標位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn