Consider a Rust program that must create many instances of a struct
in memory. The size in bytes of each struct
will begin to matter to the program's performance.
With repr packed, we can change the struct
layout to be condensed for minimal memory usage. This can speed up (or slow down) programs.
This program has 2 structs: the Node struct
, and the NodePacked
struct
. The NodePacked
struct
uses the packed representation.
struct
has a 4-byte id, and a 1-byte
data member. The packed struct
is 5 bytes, but the first struct
is 8 bytes.struct
. Some structs, like those with pointers to the heap, should not be packed.size_of
function from std mem to get the size of the structs in the program.use std::mem; struct Node { id: u32, data: u8, } #[repr(packed)] struct NodePacked { id: u32, data: u8, } fn main() { println!("{}", mem::size_of::<NodePacked>()); println!("{}", mem::size_of::<Node>()); }5 8
We can see a performance loss, or a performance gain with packed repr on a struct
in Rust. Accesses to some fields will no longer be aligned, so they will slow down.
struct
can sometimes influence performance—this depends on how a field is aligned in memory.With repr packed, we can adjust the memory usage of a Rust program. And with size_of
, we can monitor memory usage changes and keep track of struct
sizes.