簡體   English   中英

為什么不是指向成員函數的指針只是像數據指針那樣的內存地址

[英]Why aren't pointers to member functions just memory address like data pointers

我從這個 FAQ條目中意識到,無法將指向成員函數的指針轉換為void* 指向成員的原因不是內存地址,就像數據指針一樣! 為什么這樣? 請幫我澄清一下。 這不一定與成員函數,但任何正常的C函數,不是嗎?

指向成員的指針不是內存地址,就像數據指針一樣! 為什么這樣?

指向成員函數的指針需要指示函數是否為虛函數,並允許虛擬調度(可能通過將指數指定到vtable中,而不是指定特定函數的地址),如果是這樣的話。 這使得它們比僅僅地址更復雜。

這不一定與成員函數,但任何正常的C函數,不是嗎?

指向“普通”(非成員)函數的指針可以轉換為對象指針,但不能移植。 引用標准:

C ++ 11 5.2.10 / 8有條件地支持將函數指針轉換為對象指針類型,反之亦然。 這種轉換的意義是實現定義的,[...]

在許多平台上,(非成員)函數指針只是一個內存地址,轉換是明確定義的。 某些平台具有更多奇特的內存架構 - 例如,用於指令和數據的單獨內存空間 - 並且可能不允許在這些平台上進行轉換。

在C ++標准中

正如下一個FAQ所說:

該語言不要求函數和數據在同一地址空間中,因此,作為示例而非限制,對於將它們置於不同地址空間中的體系結構,兩種不同的指針類型將不具有可比性。

在§5.2.10/ 8(具體為N3936)中,該標准規定這確實是實現定義的

有條件地支持將函數指針轉換為對象指針類型(反之亦然)。 這種轉換的含義是實現定義的,除非實現支持兩個方向的轉換,將一種類型的prvalue轉換為另一種類型並返回,可能具有不同的cv-限定,將產生原始指針值。

這里的行為很明確。

在C標准中

C標准似乎沒有考慮從函數指針到對象指針的轉換。 事實上,它們之間幾乎沒有界線。

它只是在§6.3.2.3/ 8中指出:

指向一種類型的函數的指針可以被轉換為指向另一種類型的函數的指針並且再次返回; 結果應該等於原始指針。 如果轉換的指針用於調用類型與引用類型不兼容的函數,則行為未定義。

在這一點上,行為幾乎似乎沒有具體說明

然后在§6.5.9/ 6中:

兩個指針比較相等,當且僅當兩個都是空指針時,兩者都是指向同一對象的指針(包括指向對象的指針和開頭的子對象)或函數,兩者都是指向同一數組的最后一個元素的指針對象,或者一個指向一個數組對象末尾的指針,另一個是指向緊跟在地址空間中第一個數組對象之后的另一個數組對象的開頭的指針。

在這里,我們可以看到實際差異的唯一痕跡:

當且僅當兩個指針都是指向同一對象(..) 函數[...]的[..]指針時,兩個指針才相等。

為什么呢

至於“為什么”,它似乎取決於一些架構只在兩個地址空間中具有功能和對象的事實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM