# deepsize ![](https://img.shields.io/crates/v/deepsize.svg) [![](https://img.shields.io/badge/docs-deepsize-blue.svg)](https://docs.rs/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 ```rust 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::() + size_of::() * 12); } ```