Как мне выровнять переменную в Rust? - PullRequest
2 голосов
/ 18 октября 2019

В моем коде у меня есть тип, который выровнен по 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 байт? (кроме оборачивания его в структуру, которая правильно выровнена)

1 Ответ

1 голос
/ 01 ноября 2019

Используйте align_to, чтобы получить выровненный фрагмент.

Чтобы выровнять данные в первую очередь, вы можете использовать оболочку с #[repr(align(x))]:

#[repr(align(8))] 
struct Wrapper([u8; 200]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...