本文簡要介紹rust語言中 Function core::hint::unreachable_unchecked
的用法。
用法
pub const unsafe fn unreachable_unchecked() -> !
通知編譯器代碼中的這一點不可到達,從而實現進一步優化。
安全性
達到這個函數就完全未定義的行為(UB)。特別是,編譯器假設所有 UB 絕不會發生,因此將消除所有到達調用的分支unreachable_unchecked()
.
像所有 UB 實例一樣,如果這個假設被證明是錯誤的,即 unreachable_unchecked()
調用在所有可能的控製流中實際上是可達的,編譯器將應用錯誤的優化策略,有時甚至可能破壞看似無關的代碼,導致difficult-to-debug 問題。
僅當您可以證明代碼永遠不會調用它時才使用此函數。否則,請考慮使用 unreachable!
宏,該宏不允許優化,但在執行時會出現Panics。
示例
fn div_1(a: u32, b: u32) -> u32 {
use std::hint::unreachable_unchecked;
// `b.saturating_add(1)` is always positive (not zero),
// hence `checked_div` will never return `None`.
// Therefore, the else branch is unreachable.
a.checked_div(b.saturating_add(1))
.unwrap_or_else(|| unsafe { unreachable_unchecked() })
}
assert_eq!(div_1(7, 0), 7);
assert_eq!(div_1(9, 1), 4);
assert_eq!(div_1(11, u32::MAX), 0);
相關用法
- Rust unreachable_unchecked用法及代碼示例
- Rust unreachable用法及代碼示例
- Rust unimplemented用法及代碼示例
- Rust unit用法及代碼示例
- Rust u128.checked_pow用法及代碼示例
- Rust usize.wrapping_mul用法及代碼示例
- Rust u8.rotate_left用法及代碼示例
- Rust u64.rotate_right用法及代碼示例
- Rust u16.saturating_add用法及代碼示例
- Rust u128.borrowing_sub用法及代碼示例
- Rust u64.overflowing_mul用法及代碼示例
- Rust usize.wrapping_neg用法及代碼示例
- Rust u32.saturating_sub用法及代碼示例
- Rust u32.unstable_next_multiple_of用法及代碼示例
- Rust u8.pow用法及代碼示例
- Rust u128.to_be用法及代碼示例
- Rust u32.wrapping_pow用法及代碼示例
- Rust u64.log用法及代碼示例
- Rust u32.checked_neg用法及代碼示例
- Rust usize.checked_div用法及代碼示例
- Rust u64.overflowing_sub用法及代碼示例
- Rust u16.rem_euclid用法及代碼示例
- Rust u32.overflowing_add用法及代碼示例
- Rust usize.saturating_pow用法及代碼示例
- Rust u8.is_ascii_whitespace用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function core::hint::unreachable_unchecked。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。