最近我在学习Rust中的类型布局时,发现Rust中的结构体支持#[repr(C)]指令,因此我想看看默认(Rust)表示和类C表示之间的区别。下面是代码:
use type_layout::TypeLayout;
#[derive(TypeLayout)]
struct ACG1 {
time1: u16, // 2
time2: u16, // 2
upper: u32, // 4
lower: u16, // 2
}
#[derive(TypeLayout)]
#[repr(C)]
struct ACG2 {
time1: u16, // 2
time2: u16, // 2
upper: u32, // 4
lower: u16, // 2
}
fn main() {
println!("ACG1: {}", ACG1::type_layout());
println!("ACG2: {}", ACG2::type_layout());
}
我得到以下输出:
我理解如何填充#[repr(C)]结构体以及整个结构体的大小的规则,但让我困惑的是Rust表示结构体ACG1。我找不到有关Rust填充规则的清晰文档,我认为填充大小也应包括在结构体的总大小中,但为什么ACG1的大小只有12个字节?顺便说一下,这是我用来协助打印结构布局的crate:type-layout 0.2.0
std::mem::size_of::<Type>()
来初始化的,而std::mem::size_of::<ACG1>()
确实返回12。请参见此处以了解如何计算结构体的大小。 - Herohtar