函數指標相等且不同位址
問題:
在C 中,是函數指針對於保證具有不同位址的不同函數?具體來說,對於以下程式碼:
&foo != &bar 和 &foo
答案:
標準沒有明確要求不同函數的函數指標具有不同的位址。但是,它確實允許實現最佳化具有相同定義的函數,並且這種最佳化可能會導致相同的函數位址。
事實上,Microsoft Visual C (MSVC) 積極折疊具有相同實作的函數,為它們分配相同的位址。這種行為被認為是不合格的。
另一方面,Gold 連結器提供了更安全的設置,可以為函數維護不同的位址,即使它們具有相同的定義。
詳細解釋:
C 標準將函數指標的相等性定義為如下所示:
後一個條件為實現別名不同的函數提供了自由度,並且沒有明確要求指向不同函數的指標不相等。
但是,取得函數的位址是可觀察的行為,更改位址可能會違反「as-if」規則。此規則要求實現的行為與標準中指定的行為無法區分。
因此,雖然標準沒有明確禁止函數位址別名,但可以說它違反了「as-if」規則,導致不合格
觀察:
結論:
雖然標準允許函數位址別名,但通常建議避免這種最佳化,因為它會產生可移植性和可靠性問題.
以上是不同的 C 函數是否始終具有不同的函數指標位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!