使用“无法连接!”vs“恐慌!”是否有任何性能优势?

时间:2017-05-30 06:28:30

标签: rust

unreachable!宏的存在纯粹是为了在阅读代码时清晰起见,还是它提供了任何功能上的优势?

1 个答案:

答案 0 :(得分:14)

是的,unreachable! macro(以及unimplemented!)纯粹是为了清晰起见。他们implemented直接转发到panic!

#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
macro_rules! unreachable {
    () => ({
        panic!("internal error: entered unreachable code")
    });
    ($msg:expr) => ({
        unreachable!("{}", $msg)
    });
    ($fmt:expr, $($arg:tt)*) => ({
        panic!(concat!("internal error: entered unreachable code: ", $fmt), $($arg)*)
    });
}

#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
macro_rules! unimplemented {
    () => (panic!("not yet implemented"))
}

不要与unreachable intrinsic混淆(通过unreachabledebug_unreachable crates可以在稳定的Rust中访问),不安全断言分支是完全无法访问的。这允许在优化时完全移除分支。如果断言证明是错误的,那么它可能导致未定义的行为,而unreachable!()只会引起恐慌。