簡體   English   中英

reinterpret_cast到函數指針

[英]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.

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