为了更好地理解Rust panic /异常机制,我编写了以下代码:

#![feature(libc)]

extern crate libc;

fn main() {
    let mut x: i32;
    unsafe {
      x = libc::getchar();
    }

    let y = x - 65;
    println!("{}", x);

    let z = 1 / y;
    println!("{}", z);
}

我想看看Rust是如何处理零除法的.最初,我认为它要么是把一个未经处理的SIGFPE带到脸上,然后死go ,要么是它执行了一个处理程序,并将其重新路由到panic 状态(现在可以处理吗?).

代码非常冗长,因为我想确保Rust在编译时知道某个值为零时不会做任何"聪明"的事情,因此用户输入为零.只要给它一个"A",它就会成功.

我发现Rust实际上生成的代码每次除法之前都会判断零除法.我甚至看了一次大会.:-)

长话短说:我可以禁用这种行为吗?我认为对于较大的数据集,这可能会对性能产生相当大的影响.为什么不使用我们的CPU能力来检测这些东西呢?我可以设置自己的信号处理器来处理SIGFPE吗?

根据an issue on Github人的说法,前一段时间情况肯定有所不同.

我认为事先判断每个部门离"零成本"很远.你怎么认为?我是不是漏掉了什么明显的东西?

推荐答案

长话短说:我可以禁用这种行为吗?

是的,你可以:std::intrinsics::unchecked_div(a, b).

它在文件中指出:

这是一个每晚只做实验的API.(核心要素)

本质不太可能稳定,相反,它们应该通过标准库其余部分的稳定接口使用

因此,你必须使用夜间构建,而且它不太可能以稳定的形式出现在标准库中,原因Matthieu M.已经指出.

Rust相关问答推荐

如何访问Rust存储值的内存地址

亚性状上位性状上的 rust 病伴生型界限

为什么reqwest以文本形式下载二进制文件?

无法定义名为&new&的关联函数,该函数的第一个参数不是self

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

`RwLockWriteGuard_,T`不实现T实现的特征

Rust函数的返回值不能引用局部变量或临时变量

Tokio';s io::用Cursor拆分<;Vec<;u8>>;赢得';t get the full writted data

为什么我需要 to_string 函数的参考?

如何返回 struct 体中向量的切片

Rust 并行获取对 ndarray 的每个元素的可变引用

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

为什么 Rust 的临时值有时有参考性有时没有?

有没有办法通过命令获取 Rust crate 的可安装版本列表?

将 Futures 的生命周期特征绑定到 fn 参数

如何将参数传递给Rust 的线程?

Cargo:如何将整个目录或文件包含在功能标志中?

火箭整流罩、tokio-scheduler 和 cron 的生命周期问题

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

如何将 while 循环内的用户输入添加到 Rust 中的向量?