使用 `unreachable!` 与 `panic!` 相比有性能优势吗?

问题描述 投票:0回答:1

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

rust
1个回答
30
投票

是的,

unreachable!
(以及
unimplemented!
)纯粹是为了清晰起见。它们实现直接转发到
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
内在(在稳定的 Rust 中可通过
unreachable
debug_unreachable
板条箱访问)混淆,后者不安全地断言分支完全无法访问。这使得优化时可以完全删除分支。如果断言被证明是错误的,则可能会导致未定义的行为,而
unreachable!()
只会引起恐慌。

© www.soinside.com 2019 - 2024. All rights reserved.