В моем коде у меня есть тип, который выровнен по 1 байту, и функция, которая требует тип, который выровнен по 8 байтов. Следующий гипотетический код демонстрирует это использование:
fn use_bar(bar: &mut [u64; 25]) {
unimplemented!()
}
fn main() {
let mut foo: [u8; 200] = get_foo();
unsafe {
// Option 1
use_bar(mem::transmute::<&mut [u8; 200], &mut [u64; 25]>::(&mut foo));
// Option 2
use_bar(&mut *(&mut foo as *mut [u8; 200] as *mut [u64; 25]));
}
}
К сожалению, это не обязательно работает. Если вы спросите clippy о первом варианте, он скажет вам, что преобразование ссылок - плохая вещь. Вариант 2 может сработать, однако он скажет вам, что требования к выравниванию для [u64; 25]
более строгие (8-байтовое выравнивание), чем для [u8; 200]
(1-байтовое выравнивание), поэтому это может привести к неопределенному поведению.
Поскольку я не контролирую тип, возвращаемый get_foo()
, могу ли я заставить foo
быть выровненным на 8 байт? (кроме оборачивания его в структуру, которая правильно выровнена)