单态化与静态分发
学习目标
- 理解单态化的原理
- 掌握
impl Trait语法 - 理解编译时间 vs 运行时间权衡
核心概念
单态化
// 泛型函数
fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
a + b
}
fn main() {
add(1, 2); // 编译器生成 add_i32
add(1.0, 2.0); // 编译器生成 add_f64
// 每种类型一个副本,零运行时开销
}
impl Trait 语法糖
// 等价于泛型 + trait bound
fn make_adder(offset: i32) -> impl Fn(i32) -> i32 {
move |x| x + offset
}
// 编译器知道具体类型,可以内联优化
静态 vs 动态
| 特性 | 静态分发 | 动态分发 |
|---|---|---|
| 语法 | impl Trait | dyn Trait |
| 确定时机 | 编译时 | 运行时 |
| 性能 | 更快(内联) | 有间接调用开销 |
| 二进制大小 | 更大(每个类型一份) | 更小 |
| 灵活性 | 类型必须编译时确定 | 可以运行时变化 |
小结
| 概念 | 说明 |
|---|---|
| 单态化 | 为每个具体类型生成代码 |
impl Trait | 静态分发 |
dyn Trait | 动态分发 |
| 权衡 | 编译时间 vs 运行时间 vs 二进制大小 |