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

最佳答案

是的, 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(可通过 unreachable debug_unreachable crate 在稳定的Rust中访问)混淆,后者不安全地断言分支是完全不可访问的。这样可以在优化时完全删除分支。与断言的unreachable!()相比,如果断言是错误的,则可能导致未定义的行为。

关于rust - 使用 `unreachable!`和 `panic!`有什么性能优势?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44254995/

10-10 18:34