如何获取对象的运行时内存大小?

Dat*_*Dao 2 memory rust

我试图弄清楚如何在 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()因为通常你有一个特征或一些在编译时不知道大小的东西。

tre*_*tcl 6

使用std::mem::size_of_val获得片的大小:

println!("The useful size of `v` is {}", size_of_val(&*v));
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您必须取消引用 aVec<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)