rust - 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"),
}),
],
};
在这种情况下,在编译时,我知道向量有这些实例,所以我不明白需要这种损失。
这与拥有一个字符串向量有什么不同?它们也可能有不同的尺寸。
解决方案
Rust 没有Vec
在编译时使用 s 执行此操作的通用内置机制,这仅仅是因为在某些(大多数?)场景中,Vec
在编译时无法确定 s 中每个对象的类型。但是,在某些情况下,优化器可能能够找出在编译时已知的类型并将函数调用去虚拟化,但是您必须分析编译的代码才能知道优化器是否能够做到这一点对于您的特殊情况。
值得注意的是,对这里效率低下的担忧可能被夸大了。虽然这两种方法都有一些开销,但很可能这不会是代码执行中最慢的部分(除非您已经对代码进行了概要分析并且知道其他情况)。
推荐阅读
- c++ - 如何在涉及类的 C++ 函数中进行 selectionSort,并且对数组进行操作 < 的重载?
- c - 指针解密功能未按预期工作
- python - 刮掉文章链接,然后刮掉该链接以获取文章中的作者
- django - 错误:“Processus”对象没有属性“outil_set”-django
- ansible - Ansible 在多台主机上的 localhost 中执行任务
- html - div 内的文本内的跨度内的 xpath 文本
- matplotlib - 使用python在指定曲线上方屏蔽/裁剪等高线图的一部分
- apache-kafka - Google Functons 通过 spring-cloud-stream 和 spring-cloud-functions 从 Kafka 接收消息
- python - 使用列表推导替换嵌套的 for 循环
- python - 输入层和第一个 LSTM 层的 Keras 功能 API 问题