Rust has a handful of mechanisms to lay out compound types in memory. They are as follows:
- Arrays
- Enums
- Structs
- Tuples
Exactly how these are laid out in memory depends on the representation chosen. By default, everything in Rust is repr(Rust)
. All repr(Rust)
types are aligned on byte boundaries to the power of two. Every type is at least one byte in memory, then two, then four, and so forth. Primitives—u8
, usize
, bool
, and &T
—are aligned to their size. In Rust, representation structures have alignment according to the largest field. Consider the following struct:
struct AGC { elapsed_time2: u16, elapsed_time1: u16, wait_list_upper: u32, wait_list_lower: u16, digital_autopilot: u16, fine_scale: u16 }
AGC
is aligned to u32
with padding inserted as appropriate to match that 32-bit alignment. Rust will re-order fields to achieve maximal packing. Enums are different, being subject to a host of optimizations, most notably null pointer optimization. See the following enumeration...