[英]reinterpret_cast to function pointer
我用reinterpret_cast<T>
進行了實驗編寫的代碼
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;
int foo()
{
cout << "foo" << endl;
return 0;
}
void (*bar)();
int main()
{
bar = reinterpret_cast<void (*)()>(foo); //Convertion a function type to a pointer to function type
bar(); //displays foo. Is it UB?
}
首先,為什么允許這樣的reinterpret_cast
轉換? 我認為這種轉變是不正確的。
標准 (C ++11§5.2.10/ 6)說
指向函數的指針可以顯式轉換為指向不同類型函數的指針。 通過指向函數類型的指針調用函數的效果是未定義的,該函數類型與函數定義中使用的類型不同。 除了將“指向T1的指針”的prvalue轉換為“指向T2的指針”類型(其中T1和T2是函數類型)並返回其原始類型產生原始指針值之外,這種指針轉換的結果未指定。
所以它是未定義的行為。
通過指向不同函數類型的指針進行正式調用的是Undefined Behavior(C ++11§5.2.10/ 6)。
在實踐中,您將丟棄int
類型的函數結果,該結果將在寄存器中返回。 因此,當您通過鑄造指針調用時可能發生的最壞情況是,這與編譯器的期望相反,寄存器已經改變了值。
另一個實際考慮因素:C ++不支持在函數和數據指針之間進行轉換,但是Posix實際上需要轉換為void*
並返回工作正常。 C ++限制可能支持哈佛架構機器,其中指令不是通過與普通數據相同的總線和存儲器檢索的。 但Posix往返可能也適用於這種架構,除非數據地址空間遠小於指令地址空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.