Rust-对象的运行时内存大小

时间:2020-06-27 17:44:28

标签: memory rust

我试图弄清楚如何获得锈对象的大小(在编译时可能知道或可能不知道)。我希望能够在程序运行时的任何时候获取字节数。这是一个例子。

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更通用的方法,因为您经常具有某种特征或某些在编译时未知大小的东西。

有人有什么想法吗?

1 个答案:

答案 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),就算在内。
相关问题