Возможно ли когда-нибудь иметь тип в Rust с большим выравниванием, чем его собственный размер? И наоборот, всегда ли компилятор ржавчины добавляет заполнение к типу, чтобы его размер был хотя бы кратным его выравниванию?
Этот простой пример кода может показывать, что ответ отрицательный, все типы имеют размер, который это кратность их выравнивания, но я хотел убедиться, что нет больше эзотерических c возможностей.
use std::mem::{size_of, align_of};
struct b1 {
byte: u8
}
#[repr(align(4))]
struct b4 {
byte: u8
}
struct b5 {
a: u8,
b: u8,
c: u8,
d: u8,
e: u8,
}
#[repr(align(8))]
struct b8 {
a: u8,
b: u8,
c: u8,
d: u8,
e: u8,
}
fn main() {
assert_eq!(size_of::<b1>(), 1);
assert_eq!(align_of::<b1>(), 1);
assert_eq!(size_of::<b4>(), 4);
assert_eq!(align_of::<b4>(), 4);
assert_eq!(size_of::<b5>(), 5);
assert_eq!(align_of::<b5>(), 1);
assert_eq!(size_of::<b8>(), 8);
assert_eq!(align_of::<b8>(), 8);
}
Есть похожий вопрос для C ++ , где ответ похоже, «не в стандартном C ++, но некоторые расширения компилятора поддерживают его. В этом случае вы не можете создать массив T».