2017-09-16 55 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)); 
} 

这将有望达到同样的事情。

相关问题