#size #heap #stack

no-std deepsize

A crate for measuring the total size of object on the stack and heap

4 releases

0.2.0 Oct 27, 2020
0.1.2 Jul 13, 2019
0.1.1 Jan 24, 2019
0.1.0 Jan 23, 2019

#177 in Memory management

Download history 5974/week @ 2023-11-18 11888/week @ 2023-11-25 7716/week @ 2023-12-02 9356/week @ 2023-12-09 11063/week @ 2023-12-16 4354/week @ 2023-12-23 5883/week @ 2023-12-30 10275/week @ 2024-01-06 9272/week @ 2024-01-13 8554/week @ 2024-01-20 9073/week @ 2024-01-27 11513/week @ 2024-02-03 13001/week @ 2024-02-10 10634/week @ 2024-02-17 12915/week @ 2024-02-24 11728/week @ 2024-03-02

49,975 downloads per month
Used in 26 crates (14 directly)

MIT license

38KB
672 lines

deepsize

A trait and derive macro to recursively find the size of an object and the size of allocations that it owns.

This should work in #[no_std] environments, but requires the alloc crate.

Ownership and Reference Counting

DeepSizeOf counts all memory considered "owned" by the structure that it is finding the size of. Structures behind & and &mut references are not counted towards the total size of the structure; however, uniquely owned structures such as Box and Vec are.

Reference counted pointers (Arc, and Rc) are counted the first time that they appear, and are tracked to prevent them from being counted multiple times. The Weak variants of each are treated like references, and are not counted.

Features

  • std (enabled by default): Adds implementations of DeepSizeOf for types only found in std such as HashMap and Mutex.
  • derive (enabled by default): Adds support for a derive macro for DeepSizeOf.

deepsize also has optional support for these external crates:

  • slotmap: (version 0.4)
  • slab: (version 0.4)
  • indexmap: (version 1)
  • arrayvec: (version 0.5)
  • smallvec: (version 1)
  • hashbrown: (version 0.9)
  • chrono: (version 0.4)

Example Code

use deepsize::DeepSizeOf;

#[derive(DeepSizeOf)]
struct Test {
    a: u32,
    b: Box<[u8]>,
}

fn main() {
    let object = Test {
        a: 15,
        b: Box::new(b"Hello, Wold!"),
    };
    
    assert_eq!(object.deep_size_of(), size_of::<Test>() + size_of::<u8>() * 12);
}

Dependencies

~0–0.9MB
~16K SLoC