我希望我的类中有两个值类型成员指向相同的内存地址,因此初始化一个会初始化另一个,而更改一个会改变另一个。或者,它可以是函数中的两个变量,或者是将变量或常量值转换为不同类型的方法。
为什么有人会想要这个的最简单的例子是经典的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 :(得分:0)
你想要的是一个矛盾的术语。值类型值不指向任何内容(无论它们是否为成员) - 仅引用类型值。例如,请参阅here。
您似乎在想象我们在文件系统中拥有的东西:几个“硬链接”可以指向相同的物理位置。但在这种情况下,如果你愿意的话,它们仍然是链接 - “参考类型值”。
在将float作为整数操作的示例中,您可能有类似
的内容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));
}
这有望成为同样的事情。