Closed cmyr closed 6 months ago
This is cast_slice
. Note that it will (correctly) fail if the slice's address is not aligned to std::mem::align_of::<T>()
, since a &[T]
must be aligned to the alignment of T
.
Yep.
Best practice is to start with the most aligned type you want a slice of and then cast_slice
to a less aligned type (if any).
// using u64 as an example type:
let mut buf: Vec<u64> = vec![0_u64; 32];
let byte_buf: &mut [u8] = cast_slice_mut(&mut buf);
copy_u64_data_to_byte_buffer_somehow(byte_buf);
// now `buf` has the updated u64 values.
ah okay I was confused thinking that cast_slice
required a 1:1 correspondence between A
and B
. Thanks!
The output slice will have an adjusted size when the start and end types differ in size. If an exact output size doesn't work it will panic. If you want to avoid the panic, the try_
versions can do that.
For example, a slice of two 4-byte entries (8 bytes) cast to a type that's 6 bytes big would have 2 "slop" bytes, and that would error/panic.
I assume I'm just missing this, but I don't see a conversion function for reinterpreting a byte slice as a slice of some type
T
. Assuming that other invariants are upheld and thatslice.len()
is divisible bysize_of::<T>()
then I think this should be fine. Am I overlooking anything?