Функция hint::unreachable_unchecked
Функция unreachable_unchecked из модуля std::hint
сообщает компилятору, что выполнение программы
никогда не должно достигнуть этой точки.
Она не принимает параметров и возвращает значение
типа ! (never type), которое может быть
приведено к любому другому типу.
Функция является unsafe, потому что при
достижении этой точки во время выполнения
поведение программы становится неопределённым.
В отличие от макроса unreachable!, который
паникует при достижении, данная функция не выполняет
никаких проверок и не генерирует код паники.
Компилятор вправе считать эту ветку кода
недостижимой и оптимизировать её.
Синтаксис
unsafe { std::hint::unreachable_unchecked() }
Пример
Давайте рассмотрим ситуацию, когда значение переменной гарантированно находится в известном диапазоне, и мы хотим сообщить об этом компилятору:
fn main()
{
let x: u8 = 1;
let res = match x
{
0 => "zero",
1 => "one",
2 => "two",
_ => unsafe { std::hint::unreachable_unchecked() },
};
println!("{}", res);
}
Результат выполнения кода:
"one"
Пример
Давайте рассмотрим пример, где после проверки условия мы точно знаем, что значение не может быть отрицательным:
fn abs(x: i32) -> i32
{
if x >= 0
{
x
}
else
{
-x
}
}
fn main()
{
let res = abs(-5);
println!("{}", res);
}
Результат выполнения кода:
5
Опасность функции
Если условие, которое программист считал гарантированным, окажется ложным, поведение программы становится неопределённым. Компилятор может удалить проверки, изменить порядок выполнения или привести к другим непредсказуемым последствиям.
Смотрите также
-
ключевое слово
unsafe,
которое открывает доступ к небезопасным операциям -
функция
assert_unchecked,
которая сообщает компилятору о выполнении условия -
функция
black_box,
которая препятствует оптимизациям компилятора -
функция
transmute,
которая переинтерпретирует тип значения