[−][src]Macro bytemuck::offset_of
Find the offset in bytes of the given $field
of $Type
. Requires an
already initialized $instance
value to work with.
This is similar to the macro from memoffset
,
however it uses no unsafe
code.
This macro has a 3-argument and 2-argument version.
- In the 3-arg version you specify an instance of the type, the type itself, and the field name.
- In the 2-arg version the macro will call the
default
method to make a temporary instance of the type for you.
The output of this macro is the byte offset of the field (as a usize
). The
calculations of the macro are fixed across the entire program, but if the
type used is repr(Rust)
then they're not fixed across compilations or
compilers.
CAUTION: It is unsound to use this macro with a repr(packed)
type.
Currently this will give a warning, and in the future it will become a hard
error.
- See rust-lang/rust#27060 for more info and for status updates.
- Once this issue is resolved, a future version of this crate will use
raw_ref
to correct the issue. For the duration of the1.x
version of this crate it will be an on-by-default cargo feature (to maintain minimum rust version support).
Examples
3-arg Usage
// enums can't derive default, and for this example we don't pick one enum MyExampleEnum { A, B, C, } // so now our struct here doesn't have Default #[repr(C)] struct MyNotDefaultType { pub counter: i32, pub some_field: MyExampleEnum, } // but we provide an instance of the type and it's all good. let val = MyNotDefaultType { counter: 5, some_field: MyExampleEnum::A }; assert_eq!(offset_of!(val, MyNotDefaultType, some_field), 4);
2-arg Usage
#[derive(Default)] #[repr(C)] struct Vertex { pub loc: [f32; 3], pub color: [f32; 3], } // if the type impls Default the macro can make its own default instance. assert_eq!(offset_of!(Vertex, loc), 0); assert_eq!(offset_of!(Vertex, color), 12);