gpt4 book ai didi

rust - 如何在不分别分配堆上的每个项目的情况下创建拥有的特征对象列表?

转载 作者:行者123 更新时间:2023-12-03 11:23:56 26 4
gpt4 key购买 nike

我想要一个拥有的 Rust 特征对象列表。我可以将它实现为 Vec<Box<dyn Trait>>但这会为每个特征对象在堆上分配空间。我更喜欢的是 CompactList<dyn Trait>使用如下所示的内存表示键入:

[vtable1, size1, data1, vtable2, size2, data2, vtable3, size3, data3]
size*是对应 data* 的字节大小.

有了这个,我可以创建一个 Iterator<Item = &dyn Trait> .我需要的唯一操作 CompactList<T>push()iter() .

最佳答案

dynstack crate 做你想要的。它依赖于胖指针的表示,这就是 trait 对象,而且这种表示在理论上可能有一天会改变。

虽然它解决了避免为每个对象分配堆的问题,但它在内存中的表示是不同的:基本上有两个列表而不是平面列表:

  • [data1, data2, ...]
  • [(vtable1, size1), (vtable2, size2), ...]

  • data结构可以有不同的大小,您的表示不支持 O(1) 随机访问,而这个支持。 See this blog post for details .

    示例,改编自文档:
    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);
    }

    关于rust - 如何在不分别分配堆上的每个项目的情况下创建拥有的特征对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60741852/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com