
рдкрд░рд┐рдЪрдп
рдбреЗрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╡реНрдпрд╛рдкрдХ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд░рд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рднреА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рд╡реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдЧрддрд┐ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рдорд┐рд╕рд╛рд▓ рд╣реИ - рдЖрдВрддрд░рд┐рдХ mem::transmute<T, U>
, рдЗрди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╣реА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╛рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд┐рд╡рд░рдг
mem::transmute<T, U>
рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рд░реВрд╕реНрдЯ рднрд╛рд╖рд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рдмрд┐рдЯреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ:
pub unsafe extern "rust-intrinsic" fn transmute<T, U>(e: T) -> U
рдкреБрди: рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ T
рдХреЗ рдкреБрдирд░реНрд╡реНрдпрд╛рдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рдЪрд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ "рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ" (рд▓реЗрдХрд┐рди рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдмреБрд▓рд╛рдП рдмрд┐рдирд╛)ред
рднреМрддрд┐рдХ рд╕реНрдореГрддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдирдХрд▓ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╕рд┐рд░реНрдл рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк T
рдХреА рд╕рд╛рдордЧреНрд░реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ U
рдпрджрд┐ T
рдФрд░ U
рд▓рдВрдмрд╛рдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рди рддреЛ рддрд░реНрдХ рдФрд░ рди рд╣реА рд░рд┐рдЯрд░реНрди рдорд╛рди рдЕрдорд╛рдиреНрдп рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИ, рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдХрд╛рд░рдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- рдЕрдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛;
- рдЕрдорд╛рдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдЖрджрд┐рдо рдмрдирд╛рдирд╛;
- рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рд╕рдВрднрд╡ рд╣реИ;
non-repr(C)
рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд;- рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЬреАрд╡рди рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рдирд┐рдпрдорд┐рдд рд▓рд┐рдВрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕рдВрдмрдВрдзрд┐рдд рдЬреАрд╡рди рд╕рдордп рдореЗрдВ рдкрд░рд┐рдгрд╛рдо;
- рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд▓рд┐рдВрдХ рдХреЛ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рдПрдХ рдореЗрдВ рдмрджрд▓рдирд╛ред
рдЦреБрд▓реЗ рдЕрд╡рд╕рд░
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рддрдХрдиреАрдХ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рд╛ рдкреИрдЯрд░реНрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ (рдпрд╛, рдЖрдорддреМрд░ рдкрд░, рдЯрд╛рдЗрдкрд┐рдВрдЧ рдкрд╛рдЗрдВрдЯрд┐рдВрдЧ, рдЬрд╣рд╛рдВ T
рдФрд░ U
рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдирд╣реАрдВ рд╣реИрдВ):
let bitpattern = unsafe { std::mem::transmute::<f32, u32>(1.0) }; assert_eq!(bitpattern, 0x3F800000);
рдПрдХ рд░реЙ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдХрд░реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрд╣ рддрдХрдиреАрдХ рдЙрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдмреАрдЪ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдирд┐рдпрдорд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЖрдХрд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
fn foo() -> i32 { 0 } let pointer = foo as *const (); let function = unsafe { std::mem::transmute::<*const (), fn() -> i32>(pointer) }; assert_eq!(function(), 0);
рдЬреАрд╡рди рд╕рдордп рд╡рд┐рд╕реНрддрд╛рд░ рдпрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЬреАрд╡рди рд╕рдордп рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдирд╛ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрдиреНрдирдд рдЬрдВрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ:
struct R<'a>(&'a i32); unsafe fn extend_lifetime<'b>(r: R<'b>) -> R<'static> { std::mem::transmute::<R<'b>, R<'static>>(r) } unsafe fn shorten_invariant_lifetime<'b, 'c>(r: &'b mut R<'static>) -> &'b mut R<'c> { std::mem::transmute::<&'b mut R<'static>, &'b mut R<'c>>(r) }
рд╡рд┐рдХрд▓реНрдк рдмрдЦреНрд╢рд╛
рдореВрд▓ рд░реВрдк рд╕реЗ, as
рд╕рд╣рдЬрддрд╛ рд╕реЗ mem::transmute<T, U>
рдХрд╛рд░рдг рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ mem::transmute<T, U>
:
let ptr = &mut 0; let val_transmuted = unsafe { std::mem::transmute::<&mut i32, &mut u32>(ptr) };
рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, mem::transmute<T, U>
рдХреЛ рдПрдХ рд╕рдорд╛рди рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ mem::transmute<T, U>
:
рдФрд░ рдЗрд╕ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ slice::split_at_mut()
рддреАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ slice::split_at_mut()
рдлрд╝рдВрдХреНрд╢рди: mem::transmute<T, U>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ mem::transmute<T, U>
, рдСрдкрд░реЗрдЯрд░ рдФрд░ slice::from_raw_parts()
рдлрд╝рдВрдХреНрд╢рдиред
use std::{slice, mem};
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, mem::transmute<T, U>
рдХрд╛ рдЙрдкрдпреЛрдЧ mem::transmute<T, U>
рдХреЗрд╡рд▓ рддрдм рд╣реА рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рдХреБрдЫ рдФрд░ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ (рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдпрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред
рднрд┐рдиреНрдирддрд╛ рдореЗрдо :: рдЯреНрд░рд╛рдВрд╕рдорд┐рдЯ_рдХреЛрдкреА <рдЯреА, рдпреВ>
рд╕рд╛рдорд╛рдиреНрдп рдЖрдВрддрд░рд┐рдХ mem::transmute<T, U>
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЯрд╛рдЗрдк T
рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ mem::transmute_copy<T, U>
рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ:
pub unsafe fn transmute_copy<T, U>(src: &T) -> U
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ, рдПрдХ рддрд░реНрдХ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдЗрд╕рдХреА рдкреВрд░реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рднрд┐рдиреНрдирддрд╛ рдЕрдзрд┐рдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХрдо рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
mem::transmute<T, U>
рд╡рд┐рдкрд░реАрдд mem::transmute<T, U>
, рд╡рд░реНрддрдорд╛рди рдПрдирд╛рд▓реЙрдЧ рдПрдХ рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдкреНрд░рдХрд╛рд░ T
рдФрд░ U
рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реЛред
рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ U
рдПрдХ рдЖрдХрд╛рд░ T
рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рдЖрдк рдЙрдирдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЬреИрд╕рд╛ рдХрд┐ рдиреЛрдорд┐рдХреЛрди рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рд░рд╕реНрдЯ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг mem::transmute<T, U>
, рдФрд░ рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдерд╛ред