Add alignment to the NPO guarantee
As far as I know, this is always true already, but it's not in the text of the Option module docs, so I figured I'd bring this up to FCP it.
This commit is contained in:
parent
a32978a5e8
commit
107cd8e267
@ -41,6 +41,20 @@ macro_rules! nonzero_integers {
|
||||
/// with the exception that `0` is not a valid instance.
|
||||
#[doc = concat!("`Option<", stringify!($Ty), ">` is guaranteed to be compatible with `", stringify!($Int), "`,")]
|
||||
/// including in FFI.
|
||||
///
|
||||
/// Thanks to the [null pointer optimization],
|
||||
#[doc = concat!("`", stringify!($Ty), "` and `Option<", stringify!($Ty), ">`")]
|
||||
/// are guaranteed to have the same size and alignment:
|
||||
///
|
||||
/// ```
|
||||
/// # use std::mem::{size_of, align_of};
|
||||
#[doc = concat!("use std::num::", stringify!($Ty), ";")]
|
||||
///
|
||||
#[doc = concat!("assert_eq!(size_of::<", stringify!($Ty), ">(), size_of::<Option<", stringify!($Ty), ">>());")]
|
||||
#[doc = concat!("assert_eq!(align_of::<", stringify!($Ty), ">(), align_of::<Option<", stringify!($Ty), ">>());")]
|
||||
/// ```
|
||||
///
|
||||
/// [null pointer optimization]: crate::option#representation
|
||||
#[$stability]
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||
#[repr(transparent)]
|
||||
|
@ -119,7 +119,7 @@
|
||||
//! # Representation
|
||||
//!
|
||||
//! Rust guarantees to optimize the following types `T` such that
|
||||
//! [`Option<T>`] has the same size as `T`:
|
||||
//! [`Option<T>`] has the same size and alignment as `T`:
|
||||
//!
|
||||
//! * [`Box<U>`]
|
||||
//! * `&U`
|
||||
|
@ -43,9 +43,27 @@ use crate::slice::{self, SliceIndex};
|
||||
/// it is your responsibility to ensure that `as_mut` is never called, and `as_ptr`
|
||||
/// is never used for mutation.
|
||||
///
|
||||
/// # Representation
|
||||
///
|
||||
/// Thanks to the [null pointer optimization],
|
||||
/// `NonNull<T>` and `Option<NonNull<T>>`
|
||||
/// are guaranteed to have the same size and alignment:
|
||||
///
|
||||
/// ```
|
||||
/// # use std::mem::{size_of, align_of};
|
||||
/// use std::ptr::NonNull;
|
||||
///
|
||||
/// assert_eq!(size_of::<NonNull<i16>>(), size_of::<Option<NonNull<i16>>>());
|
||||
/// assert_eq!(align_of::<NonNull<i16>>(), align_of::<Option<NonNull<i16>>>());
|
||||
///
|
||||
/// assert_eq!(size_of::<NonNull<str>>(), size_of::<Option<NonNull<str>>>());
|
||||
/// assert_eq!(align_of::<NonNull<str>>(), align_of::<Option<NonNull<str>>>());
|
||||
/// ```
|
||||
///
|
||||
/// [covariant]: https://doc.rust-lang.org/reference/subtyping.html
|
||||
/// [`PhantomData`]: crate::marker::PhantomData
|
||||
/// [`UnsafeCell<T>`]: crate::cell::UnsafeCell
|
||||
/// [null pointer optimization]: crate::option#representation
|
||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||
#[repr(transparent)]
|
||||
#[rustc_layout_scalar_valid_range_start(1)]
|
||||
|
Loading…
x
Reference in New Issue
Block a user