2017-09-16 120 views
0

我希望有我的班點兩個值類型的成員相同的內存地址,從而使初始化一個會初始化其他的和不斷變化的人會改變對方。或者,它可以是一個函數內的兩個變量,或者一種將變量或常量值轉換爲不同類型的方法。有兩類成員指向同一個內存地址

爲什麼有人會想要這個的最簡單的例子是經典的0x5F3759DF fast inverse square root,其中浮點值被重讀爲int,被操縱並重新讀回到float。

我很清楚地記得讀一篇博客文章證實這一點,但我似乎無法立刻找到它。如果內存服務,設置類似於此:

class Dummy 
{ 
    // Make these two point to the same memory address, and initializing one would initialize the other 
    Int64 a; 
    Double b; 
} 

或者也許這兩個變量是在一個函數的開始。無論哪種方式,我真的記得,初始化一個會自動初始化另一個,並使用「未初始化」一個將無誤地工作。也許他們甚至是同一類型而不是兩種不同的類型。

FWIW,我不是目前正在努力做到這一點,而是想知道關於C#的能力做這樣的事情。

+0

雖然你可以明確的字段偏移做到這一點,雙打它更容易明確地通過'BitConverter.DoubleToInt64Bits'和[in C#C++聯盟]其反向 – harold

+1

可能的複製(https://stackoverflow.com/questions轉換/ 126781/c-union-in-c-sharp) – pvg

+0

使用屬性而不是字段:Int64 A {set;得到;} – sTrenat

回答

0

你想要的是一種自相矛盾的說法。值類型值不指向任何東西(不管它們是否是成員) - 只有引用類型值。例如,請參閱here

似乎你想象的東西像我們在文件系統:一些「硬鏈接」可以指向同一物理位置。但在那種情況下,如果你願意的話,它們仍然是鏈接 - 「引用類型值」。

在與浮子爲整數的操縱你的榜樣,你可能有類似

struct my_algorithm_state_t { 
    float value; 
} 

void manipulate(my_algorithm_state_t& state) { 
    auto reinterpreted_value = reinterpret_cast<int32_t&>(*state.value); 
    /* ... do stuff with reinterpreted_value*/ 
} 

,或者更簡單地說

void manipulate(my_algorithm_state_t& state) { 
    state.value = actually_manipulate(reinterpret_cast<int32_t>(state.value)); 
} 

這將有望達到同樣的事情。

相關問題