为了更好地理解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人的说法,前一段时间情况肯定有所不同.
我认为事先判断每个部门离"零成本"很远.你怎么认为?我是不是漏掉了什么明显的东西?