From ae60a1a8fd1a933bcb5f12335b8c34ad2bed68d6 Mon Sep 17 00:00:00 2001 From: Alexis Beingessner Date: Mon, 13 Jul 2015 22:36:09 -0700 Subject: [PATCH] several fixups --- other-reprs.md | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/other-reprs.md b/other-reprs.md index 068d30c..d168dcb 100644 --- a/other-reprs.md +++ b/other-reprs.md @@ -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. \ No newline at end of file +[drop flag]: drop-flags.html