3 回答

TA貢獻1809條經驗 獲得超8個贊
DK有一個很好的解釋,我將舉一個例子,在該例子中我們在堆棧上分配Dogor Wolf,避免堆分配:
fn main() {
let dog;
let wolf;
let animal: &Barks;
if 1 == 2 {
dog = Dog;
animal = &dog;
} else {
wolf = Wolf;
animal = &wolf;
}
animal.bark();
}
這有點丑陋,但是引用實現的間接尋址與相同,而Box開銷卻很少。

TA貢獻1995條經驗 獲得超2個贊
定義自定義枚舉是最有效的方法。這將允許您在堆棧上精確分配所需的空間量,即最大選項的大小,再加上1個額外的字節以跟蹤存儲哪個選項。與使用a Box或trait引用的解決方案不同,它還允許直接訪問而無需間接級別。
不幸的是,它確實需要更多樣板:
enum WolfOrDog {
IsDog(Dog),
IsWolf(Wolf)
}
use WolfOrDog::*;
impl Barks for WolfOrDog {
fn bark(&self) {
match *self {
IsDog(ref d) => d.bark(),
IsWolf(ref w) => w.bark()
}
}
}
fn main() {
let animal: WolfOrDog;
if 1 == 2 {
animal = IsDog(Dog);
} else {
animal = IsWolf(Wolf);
}
animal.bark();
}
在這里,main我們只使用一個堆棧分配的變量,其中包含我們自定義枚舉的一個實例。
- 3 回答
- 0 關注
- 605 瀏覽
添加回答
舉報