是否可以有一个比其自身大小对齐更大的类型



Rust中是否有可能有一个比其自身大小对齐更大的类型?相反,rust编译器是否总是为类型添加填充,使其大小至少为对齐的倍数?

这个简单的示例代码似乎表明答案是否定的,所有类型的大小都是它们对齐的倍数,但我想确保没有更深奥的可能性。

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的数组"。

Rust参考中有关于尺寸和对齐的内容(强调mine(:

尺寸和对齐方式

[…]

值的大小是数组中该项类型包含对齐填充的连续元素之间的偏移量(以字节为单位(值的大小始终是其对齐方式的倍数可以使用size_of_val函数检查值的大小。

最新更新