Функция transmute_copy
Функция transmute_copy из модуля std::mem
выполняет преобразование типа путём побайтового копирования
значения из переданной ссылки в новый тип. Первым параметром
функция принимает ссылку на исходное значение, тип которого
нужно переинтерпретировать, а вторым - целевой тип,
в который выполняется преобразование. В отличие от
transmute, эта функция не требует, чтобы размеры
исходного и целевого типов совпадали во время компиляции,
однако она копирует только столько байт, сколько занимает
целевой тип.
Функция является небезопасной, так как позволяет обойти проверки типов. Если целевой тип больше исходного, чтение выйдет за пределы исходного значения, что приводит к неопределённому поведению. Если полученное значение содержит недопустимые битовые комбинации для целевого типа, поведение также будет неопределённым.
Синтаксис
unsafe { std::mem::transmute_copy::<Src, Dst>(&src) }
Пример
Давайте преобразуем массив байтов в 32-битное целое число:
fn main()
{
let bytes: [u8; 4] = [0x01, 0x00, 0x00, 0x00];
let res: u32 = unsafe { std::mem::transmute_copy(&bytes) };
println!("{}", res);
}
Результат выполнения кода:
1
Пример
Давайте преобразуем целое число в массив байтов:
fn main()
{
let value: u32 = 12345;
let res: [u8; 4] = unsafe { std::mem::transmute_copy(&value) };
println!("{:?}", res);
}
Результат выполнения кода:
[57, 48, 0, 0]
Пример
Давайте преобразуем ссылку в указатель и обратно:
fn main()
{
let value: i32 = 42;
let ptr: *const i32 = unsafe { std::mem::transmute_copy(&value) };
let res: i32 = unsafe { std::mem::transmute_copy(&ptr) };
println!("{}", res);
}
Результат выполнения кода:
42
Смотрите также
-
функция
transmute,
которая преобразует тип с проверкой совпадения размеров во время компиляции -
функция
read,
которая читает значение из указателя без его перемещения -
функция
MaybeUninit,
которая позволяет работать с неинициализированной памятью безопаснее -
ключевое слово
unsafe,
которое открывает доступ к небезопасным операциям