gpt4 book ai didi

memory - 有没有更安全的方法使用联合在整数和 float 之间转换?

转载 作者:行者123 更新时间:2023-12-03 11:28:19 26 4
gpt4 key购买 nike

我在Rust中编写VM,并且具有C和C++背景。我需要类似工会的功能,因为在VM堆栈上,我可以存储intfloat

在C语言中,我有一个工会:

union stack_record_t {
int i;
float f;
};

我可以将记录用作 intfloat,且运行时开销为零。我有一个静态字节码分析器,它将在字节码执行之前发现类型错误,因此我不必在记录旁边存储标志。

我不知道在Rust中使用联合是不是一个好主意,因为它们是不安全的。在Rust中,有没有安全的方法可以做到这一点-成本也为零?
我应该只使用不安全的Rust联合吗?

最佳答案

您可以使用 f32::from_bits to_bits 安全地将u32的原始位重新解释为f32,反之亦然。这是一个“免费”转换-编译为无代码(启用了优化功能)。¹要在u32i32之间进行转换,您可以使用as强制转换,当用于更改符号时,它们也是免费的。

在我看来,u32是此处的公分母,因此您可以考虑制作一个包含struct并公开用于获取或设置适当类型的方法的u32:

pub struct Record(u32);

impl Record {
fn get_int(&self) -> i32 {
self.0 as _
}

fn get_float(&self) -> f32 {
f32::from_bits(self.0)
}

fn set_int(&mut self, value: i32) {
self.0 = value as _;
}

fn set_float(&mut self, value: f32) {
self.0 = value.to_bits();
}
}

Compare the generated code.

也可以看看
  • Is it possible to write Quake's fast InvSqrt() function in Rust?
  • Is transmuting bytes to a float safe or might it produce undefined behavior?
  • Is casting between integers expensive?


  • ¹这些函数在内部使用 transmute,它像使用联合一样重新解释位。因此,当它们由优化器内联时,生成的代码是相同的。

    关于memory - 有没有更安全的方法使用联合在整数和 float 之间转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60930777/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com