我试图弄清楚如何在 Rust 中获取对象的大小(以字节为单位),其中大小在编译时可能未知,也可能未知。我希望能够在程序运行期间的任何时候获取字节数。这是一个例子。
let mut v: Vec<SomeStruct> = Vec::new();
loop {
v.push(get_some_struct());
print_consumed_memory_of_vec(&v);
}
Run Code Online (Sandbox Code Playgroud)
我想要一种比这样做更通用的方法,mem::size_of<SomeStruct> * v.len()因为通常你有一个特征或一些在编译时不知道大小的东西。
使用std::mem::size_of_val获得片的大小:
println!("The useful size of `v` is {}", size_of_val(&*v));
Run Code Online (Sandbox Code Playgroud)
笔记:
Vec<T>才能获得 a,&[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)。