我试图弄清楚如何获得锈对象的大小(在编译时可能知道或可能不知道)。我希望能够在程序运行时的任何时候获取字节数。这是一个例子。
let mut v: Vec<SomeStruct> = Vec::new();
loop {
v.push(get_some_struct());
print_consumed_memory_of_vec(&v);
}
我想有一个比通常使用mem::size_of<SomeStruct> * v.len()
b / c更通用的方法,因为您经常具有某种特征或某些在编译时未知大小的东西。
有人有什么想法吗?
答案 0 :(得分:1)
使用std::mem::size_of_val
来获取切片的大小:
println!("The useful size of `v` is {}", size_of_val(&*v));
注意:
Vec<T>
才能获得&[T]
,因为Vec
本身的大小仅是三个指针的大小,但实际上您想要的是数据指针指的是。当您已经拥有&[T]
或&dyn Trait
或任何&U
且其中U
是您想知道其大小的东西时,这不是问题。Vec
中已填充部分的大小;也就是说,与size_of::<T>() * v.len()
相同。如果v
有未使用的容量,则size_of_val(&*v)
不会反映出来。没有通用的方法可以告诉您分配的大小。您必须自己跟踪。例如,这对于Rc<T>
而不是Vec<T>
也有所不同-Rc
将其引用计数存储在与T
相同的分配中,但不会如果您写size_of_val(&*rc)
,就算在内。