【发布时间】:2017-03-02 00:05:00
【问题描述】:
为了更好地理解 Rust 的恐慌/异常机制,我编写了以下代码:
#![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 带到脸上并死去,要么它实现了一个处理程序并将其重新路由到恐慌(现在可以处理了吗?)。
代码很冗长,因为我想确保当 Rust 在编译时知道某些东西为零时,它不会做任何“聪明”的事情,因此是用户输入。只要给它一个“A”,它就可以解决问题。
我发现 Rust 实际上生成的代码会在每次除法发生之前检查零除法。我什至看了一次组装。 :-)
长话短说:我可以禁用此行为吗?我想对于较大的数据集,这可能会对性能产生相当大的影响。为什么不使用我们的 CPU 能力为我们检测这些东西呢?我可以设置自己的信号处理程序并改为处理 SIGFPE 吗?
根据an issue on Github的说法,前一段时间的情况肯定有所不同。
我认为事先检查每个部门离“零成本”还很远。你怎么看?我错过了什么明显的东西吗?
【问题讨论】:
-
我很困惑。如果除数为零,您要使用检查除法还是禁用检查?
-
“为什么不使用我们的 CPU 能力为我们检测这些东西?”并非所有 CPU 都具有这种能力。 x86 会引发除以零的异常,但其他则不会;例如ARM 静默返回结果 0。
标签: performance exception rust divide-by-zero