mirror of
https://github.com/rust-lang/rust.git
synced 2026-01-19 23:40:48 +00:00
Rollup merge of #135938 - carlsverre:master, r=joboet
Add memory layout documentation to generic NonZero<T> The documentation I've added is based on the same Layout documentation that appears on the other `NonZero*` types. For example see [the Layout docs on `NonZeroI8`](https://doc.rust-lang.org/std/num/type.NonZeroI8.html#layout-1).
This commit is contained in:
commit
884ec6b4ab
@ -90,6 +90,26 @@ impl_zeroable_primitive!(
|
||||
///
|
||||
/// assert_eq!(size_of::<Option<NonZero<u32>>>(), size_of::<u32>());
|
||||
/// ```
|
||||
///
|
||||
/// # Layout
|
||||
///
|
||||
/// `NonZero<T>` is guaranteed to have the same layout and bit validity as `T`
|
||||
/// with the exception that the all-zero bit pattern is invalid.
|
||||
/// `Option<NonZero<T>>` is guaranteed to be compatible with `T`, including in
|
||||
/// FFI.
|
||||
///
|
||||
/// Thanks to the [null pointer optimization], `NonZero<T>` and
|
||||
/// `Option<NonZero<T>>` are guaranteed to have the same size and alignment:
|
||||
///
|
||||
/// ```
|
||||
/// # use std::mem::{size_of, align_of};
|
||||
/// use std::num::NonZero;
|
||||
///
|
||||
/// assert_eq!(size_of::<NonZero<u32>>(), size_of::<Option<NonZero<u32>>>());
|
||||
/// assert_eq!(align_of::<NonZero<u32>>(), align_of::<Option<NonZero<u32>>>());
|
||||
/// ```
|
||||
///
|
||||
/// [null pointer optimization]: crate::option#representation
|
||||
#[stable(feature = "generic_nonzero", since = "1.79.0")]
|
||||
#[repr(transparent)]
|
||||
#[rustc_nonnull_optimization_guaranteed]
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user