|
|
@ -231,7 +231,7 @@ fn main() {
|
|
|
|
#### &dyn和Box\<dyn\>的区别
|
|
|
|
#### &dyn和Box\<dyn\>的区别
|
|
|
|
前文提到, `&dyn` 和 `Box<dyn>` 都可以用于特征对象,因此在功能上 `&dyn` 和 `Box<dyn>` 几乎没有区别,唯一的区别就是:`&dyn` 减少了一次指针调用。
|
|
|
|
前文提到, `&dyn` 和 `Box<dyn>` 都可以用于特征对象,因此在功能上 `&dyn` 和 `Box<dyn>` 几乎没有区别,唯一的区别就是:`&dyn` 减少了一次指针调用。
|
|
|
|
|
|
|
|
|
|
|
|
因为 `Box<dyn>` 是一个宽指针(`fat pointer`),它内部保存一个指针指向 `vtable`,然后通过 `vtable` 查询到具体的函数指针,最后进行调用。
|
|
|
|
因为 `Box<dyn>` 是一个宽指针(`fat pointer`),它需要一次额外的解引用后,才能获取到指向`vtable`的指针,然后再通过该指针访问 `vtable` 查询到具体的函数指针,最后进行调用。
|
|
|
|
|
|
|
|
|
|
|
|
所以,如果你在乎性能,又想使用特征对象简化代码,可以优先考虑 `&dyn`。
|
|
|
|
所以,如果你在乎性能,又想使用特征对象简化代码,可以优先考虑 `&dyn`。
|
|
|
|
|
|
|
|
|
|
|
|