【发布时间】:2022-01-05 03:34:54
【问题描述】:
最近在学习 Rust 中的 Type Layout (https://doc.rust-lang.org/reference/type-layout.html) 时,我看到 Rust 中的 struct 支持 #[repr(C)] 指令,所以我想看看 default(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 填充规则的明确文档,并且我觉得padding的大小也应该包含在结构体的整体大小中,但是为什么ACG1的大小只有12字节呢?
顺便说一句,这是我用来协助打印结构布局的板条箱:https://crates.io/crates/type-layout
【问题讨论】:
-
可能是箱子的问题?这有点令人困惑,因为 crate 的自述文件说 “此 crate 适用于非 #[repr(C)] 类型,但它们的布局是不可预测的。”,但是 crate 的作者在他的上面有 this open issue repo 声明,“今天的板条箱实际上不适用于非 repr(C) 类型。”
-
在幕后,大小只是通过调用
std::mem::size_of::<Type>()来初始化,std::mem::size_of::<ACG1>()确实返回 12。请参阅here 了解如何计算结构的大小。跨度>