]> git.lizzy.rs Git - rust.git/commitdiff
several fixups
authorAlexis Beingessner <a.beingessner@gmail.com>
Tue, 14 Jul 2015 05:36:09 +0000 (22:36 -0700)
committerAlexis Beingessner <a.beingessner@gmail.com>
Tue, 14 Jul 2015 05:36:09 +0000 (22:36 -0700)
other-reprs.md

index 068d30c5e3da54d9ac5bafdb0c587235b36989e1..d168dcbe360beeca0cc22a2cfab2f3cfb961c6e7 100644 (file)
@@ -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