Document stable size_of primitives and pointer size guarantees

This commit is contained in:
Havvy 2017-09-16 20:40:05 -07:00
parent b492405b1f
commit 548686ff12
2 changed files with 54 additions and 2 deletions

View File

@ -177,15 +177,59 @@ pub fn forget<T>(t: T) {
/// Returns the size of a type in bytes. /// Returns the size of a type in bytes.
/// ///
/// More specifically, this is the offset in bytes between successive /// More specifically, this is the offset in bytes between successive elements
/// items of the same type, including alignment padding. /// in an array with that item type including alignment padding. Thus, for any
/// type `T` and length `n`, `[T; n]` has a size of `n * size_of::<T>()`.
///
/// In general, the size of a type is not stable across compilations, but
/// specific types such as primitives are.
///
/// The following table gives the size for primitives.
///
/// Type | size_of::\<Type>()
/// ---- | ---------------
/// () | 0
/// u8 | 1
/// u16 | 2
/// u32 | 4
/// u64 | 8
/// i8 | 1
/// i16 | 2
/// i32 | 4
/// i64 | 8
/// f32 | 4
/// f64 | 8
/// char | 4
///
/// Furthermore, `usize` and `isize` have the same size.
///
/// The types `*const T`, `&T`, `Box<T>`, `Option<&T>`, and `Option<Box<T>>` all have
/// the same size. If `T` is Sized, all of those types have the same size as `usize`.
///
/// The mutability of a pointer does not change its size. As such, `&T` and `&mut T`
/// have the same size. Likewise for `*const T` and `*mut T`.
/// ///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
/// use std::mem; /// use std::mem;
/// ///
/// // Some primitives
/// assert_eq!(4, mem::size_of::<i32>()); /// assert_eq!(4, mem::size_of::<i32>());
/// assert_eq!(8, mem::size_of::<f64>());
/// assert_eq!(0, mem::size_of::<()>());
///
/// // Some arrays
/// assert_eq!(8, mem::size_of::<[i32; 2]>());
/// assert_eq!(12, mem::size_of::<[i32; 3]>());
/// assert_eq!(0, mem::size_of::<[i32; 0]>());
///
///
/// // Pointer size equality
/// assert_eq!(mem::size_of::<&i32>(), mem::size_of::<*const i32>());
/// assert_eq!(mem::size_of::<&i32>(), mem::size_of::<Box<i32>>());
/// assert_eq!(mem::size_of::<&i32>(), mem::size_of::<Option<&i32>>());
/// assert_eq!(mem::size_of::<Box<i32>>(), mem::size_of::<Option<Box<i32>>>());
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]

View File

@ -710,6 +710,10 @@ mod prim_u128 { }
// //
/// The pointer-sized signed integer type. /// The pointer-sized signed integer type.
/// ///
/// The size of this primitive is how many bytes it takes to reference any
/// location in memory. For example, on a 32 bit target, this is 4 bytes
/// and on a 64 bit target, this is 8 bytes.
///
/// *[See also the `std::isize` module](isize/index.html).* /// *[See also the `std::isize` module](isize/index.html).*
/// ///
/// However, please note that examples are shared between primitive integer /// However, please note that examples are shared between primitive integer
@ -722,6 +726,10 @@ mod prim_isize { }
// //
/// The pointer-sized unsigned integer type. /// The pointer-sized unsigned integer type.
/// ///
/// The size of this primitive is how many bytes it takes to reference any
/// location in memory. For example, on a 32 bit target, this is 4 bytes
/// and on a 64 bit target, this is 8 bytes.
///
/// *[See also the `std::usize` module](usize/index.html).* /// *[See also the `std::usize` module](usize/index.html).*
/// ///
/// However, please note that examples are shared between primitive integer /// However, please note that examples are shared between primitive integer