让两个类成员指向相同的内存地址

时间:2017-09-16 10:23:17

标签: c# pointers unsafe

我希望我的类中有两个值类型成员指向相同的内存地址,因此初始化一个会初始化另一个,而更改一个会改变另一个。或者,它可以是函数中的两个变量,或者是将变量或常量值转换为不同类型的方法。

为什么有人会想要这个的最简单的例子是经典的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#做这样的事情的能力。

1 个答案:

答案 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));
}

这有望成为同样的事情。

相关问题