|
|
|
@ -26,9 +26,26 @@ the FFI boundary.
|
|
|
|
|
* DSTs, tuples, and tagged unions are not a concept in C and as such are never
|
|
|
|
|
FFI safe.
|
|
|
|
|
|
|
|
|
|
* **The drop flag will still be added**
|
|
|
|
|
* **The [drop flag][] will still be added**
|
|
|
|
|
|
|
|
|
|
* This is equivalent to `repr(u32)` for enums (see below)
|
|
|
|
|
* This is equivalent to one of `repr(u\*)` (see the next section) for enums. The
|
|
|
|
|
chosen size is the default enum size for the target platform's C ABI. Note that
|
|
|
|
|
enum representation in C is undefined, and this may be incorrect when the C
|
|
|
|
|
code is compiled with certain flags.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# repr(u8), repr(u16), repr(u32), repr(u64)
|
|
|
|
|
|
|
|
|
|
These specify the size to make a C-like enum. If the discriminant overflows the
|
|
|
|
|
integer it has to fit in, it will be an error. You can manually ask Rust to
|
|
|
|
|
allow this by setting the overflowing element to explicitly be 0. However Rust
|
|
|
|
|
will not allow you to create an enum where two variants have the same discriminant.
|
|
|
|
|
|
|
|
|
|
On non-C-like enums, this will inhibit certain optimizations like the null-pointer
|
|
|
|
|
optimization.
|
|
|
|
|
|
|
|
|
|
These reprs have no affect on a struct.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -40,22 +57,15 @@ byte. This may improve the memory footprint, but will likely have other
|
|
|
|
|
negative side-effects.
|
|
|
|
|
|
|
|
|
|
In particular, most architectures *strongly* prefer values to be aligned. This
|
|
|
|
|
may mean the unaligned loads are penalized (x86), or even fault (ARM). In
|
|
|
|
|
particular, the compiler may have trouble with references to unaligned fields.
|
|
|
|
|
may mean the unaligned loads are penalized (x86), or even fault (some ARM chips).
|
|
|
|
|
For simple cases like directly loading or storing a packed field, the compiler
|
|
|
|
|
might be able to paper over alignment issues with shifts and masks. However if
|
|
|
|
|
you take a reference to a packed field, it's unlikely that the compiler will be
|
|
|
|
|
able to emit code to avoid an unaligned load.
|
|
|
|
|
|
|
|
|
|
`repr(packed)` is not to be used lightly. Unless you have extreme requirements,
|
|
|
|
|
this should not be used.
|
|
|
|
|
|
|
|
|
|
This repr is a modifier on `repr(C)` and `repr(rust)`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# repr(u8), repr(u16), repr(u32), repr(u64)
|
|
|
|
|
|
|
|
|
|
These specify the size to make a C-like enum. If the discriminant overflows the
|
|
|
|
|
integer it has to fit in, it will be an error. You can manually ask Rust to
|
|
|
|
|
allow this by setting the overflowing element to explicitly be 0. However Rust
|
|
|
|
|
will not allow you to create an enum where two variants.
|
|
|
|
|
|
|
|
|
|
These reprs have no affect on a struct or non-C-like enum.
|
|
|
|
|
[drop flag]: drop-flags.html
|
|
|
|
|