Cal*_*mer 6 rust trait-objects
我想要一个拥有的 Rust 特征对象列表。我可以实现它,Vec<Box<dyn Trait>>但是它会为每个特征对象在堆上分配空间。我更喜欢的是一种CompactList<dyn Trait>具有如下内存表示的类型:
[vtable1, size1, data1, vtable2, size2, data2, vtable3, size3, data3]
Run Code Online (Sandbox Code Playgroud)
size*是相应data*.
有了这个,我可以创建一个Iterator<Item = &dyn Trait>. 我唯一需要的操作CompactList<T>是push()和iter()。
该dynstack箱子你想要做什么。它依赖于胖指针的表示,这就是 trait 对象,而且这种表示在理论上可能有一天会改变。
虽然它解决了避免为每个对象分配堆的问题,但它在内存中的表示是不同的:基本上有两个列表而不是平面列表:
[data1, data2, ...][(vtable1, size1), (vtable2, size2), ...]由于data结构可以有不同的大小,您的表示不支持 O(1) 随机访问,而这个支持。有关详细信息,请参阅此博客文章。
示例,改编自文档:
use dynstack::{dyn_push, DynStack};
use std::fmt::Debug;
let mut stack = DynStack::<dyn Debug>::new();
dyn_push!(stack, "hello, world!");
dyn_push!(stack, 0usize);
dyn_push!(stack, [1, 2, 3, 4, 5, 6]);
for item in stack.iter() {
println!("{:?}", item);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |