cppreference/reinterpret_cast 轉換/解釋說
不同于
static_cast但類似const_cast的是,reinterpret_cast 運算式不會編譯為任何 CPU 指令(除非在整數和指標之間轉換或在指標表示取決于其型別的晦澀架構上)。它純粹是一個編譯時指令,指示編譯器將運算式視為具有型別 new-type。
使用 reinterpret_cast 只能完成以下轉換,除非此類轉換會拋棄常量或易變性。
...
5) 任何物件指標型別 T1* 都可以轉換為另一個物件指標型別 cv T2*。這完全等同于static_cast<cv T2*>(static_cast<cv void*>(expression))(這意味著如果 T2 的對齊要求不比 T1 嚴格,則指標的值不會改變,并且將結果指標轉換回其原始型別會產生原始值)。在任何情況下,只有在型別別名規則允許的情況下,才能安全地取消參考結果指標(見下文)
我認為 reinterpret_cast 保證了相同的位模式,并且始終是 compile-time statement 。但是在上面的參考中,在指標表示取決于其型別的晦澀架構上存在例外,并且任何物件指標型別T1到另一個物件指標型別的轉換T2都完全等同于static_cast<cv T2>(static_cast<cv void*>(expr) ). 例如,
int a = 10;
void* b = static_cast<void*>(&a); // OK.
static_cast<int*>(b) = 20; // OK. back to the original type.
void* b2 = reinterpret_cast<void*>(&a); // char* b2 = static_cast<void*>(static_cast<void*>(&a) );
static_cast<int*>(b2) = 30; // also OK? because the resulting pointer is equivalent to b, so can be back to the original type.
如果是這樣,任何指標到指標的轉換之間b在運行時解決(可以更改位模式)?reinterpret_cast以及何時進行有區別嗎?static_cast
uj5u.com熱心網友回復:
指標位模式的更改并不像暗示的那樣非常罕見,硬體也不一定像暗示的那樣非常晦澀。最常見的情況涉及對齊要求。相當多的架構需要“自然對齊”。也就是說,具有N位大小的物件也需要N位對齊(例如,32位物件需要32位對齊)。
例如:
// address with all the bits set in the least significant byte
char *x = (char *)0xabcdef;
long *y = reinterpret_cast<long *>(x);
long z = *y;
std::cout << (void *)y;
在 x86 機器上,y通常會包含您請求的位模式(因為 x86 在硬體級別上幾乎沒有對齊要求)。
但是在 SPARC、MIPS 或 Alpha 之類的設備上,嘗試取消參考指向設定了三個最低有效位的 long 的指標將產生處理器故障。這給編譯器留下了一個選擇:生成一個不能被取消參考的指標,或者清除指標中的一些位。至少有少數人選擇后者。這當然不能保證。有些人會保持原樣,因此取消參考它只會產生處理器故障。long但是其他人試圖通過將三個(左右)最低有效位歸零來使其成為指向 a 的合法指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519696.html
