首页 > 解决方案 > Rust 不同类型的高效集合

问题描述

我知道特征对象枚举的选项可以在集合中存储不同类型的对象,但是在这两种情况下,运行时效率都会受到影响(如果我理解得很好的话)。在trait' 的情况下,必须有一个动态调度 ( dyn),在 ' 中enum,所有可能性都在运行时检查(就像一个开关)。正确的?在这两种情况下都会降低效率,所以我想知道是否有任何正确的方法可以做到这一点而不会造成这种损失。

使用示例17-9 中的示例,例如:

let screen = Screen {
        components: vec![
            Box::new(SelectBox {
                width: 75,
                height: 10,
                options: vec![
                    String::from("Yes"),
                    String::from("Maybe"),
                    String::from("No"),
                ],
            }),
            Box::new(Button {
                width: 50,
                height: 10,
                label: String::from("OK"),
            }),
        ],
    };

在这种情况下,在编译时,我知道向量有这些实例,所以我不明白需要这种损失。

这与拥有一个字符串向量有什么不同?它们也可能有不同的尺寸。

标签: rustcollections

解决方案


Rust 没有Vec在编译时使用 s 执行此操作的通用内置机制,这仅仅是因为在某些(大多数?)场景中,Vec在编译时无法确定 s 中每个对象的类型。但是,在某些情况下,优化器可能能够找出在编译时已知的类型并将函数调用去虚拟化,但是您必须分析编译的代码才能知道优化器是否能够做到这一点对于您的特殊情况。

值得注意的是,对这里效率低下的担忧可能被夸大了。虽然这两种方法都有一些开销,但很可能这不会是代码执行中最慢的部分(除非您已经对代码进行了概要分析并且知道其他情况)。


推荐阅读