Ящик dynstack делает то, что вы хотите. Он основан на представлении жирных указателей, которые являются объектами черты, и это представление теоретически может измениться однажды.
Хотя он решает проблему избегания выделения кучи для каждого объекта, его представление в памяти отличается: вместо простого списка в основном два списка:
[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);
}