mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-11 07:21:51 +00:00
Rollup merge of #44648 - Havvy:doc-size_of, r=dtolnay
Expand size_of docs This PR does 3 things. 1. Adds a description of what pointer size means to the primitive pages for usize and isize. 2. Says the general size of things is not stable from compiler to compiler. 3. Adds a table of sizes of things that we do guarantee. As this is the first table in the libstd docs, I've included a picture of how that looks. ![](https://i.imgur.com/YZ6IChH.png?1)
This commit is contained in:
commit
04eb88c987
@ -177,15 +177,59 @@ pub fn forget<T>(t: T) {
|
||||
|
||||
/// Returns the size of a type in bytes.
|
||||
///
|
||||
/// More specifically, this is the offset in bytes between successive
|
||||
/// items of the same type, including alignment padding.
|
||||
/// More specifically, this is the offset in bytes between successive elements
|
||||
/// 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
|
||||
///
|
||||
/// ```
|
||||
/// use std::mem;
|
||||
///
|
||||
/// // Some primitives
|
||||
/// 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]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -710,6 +710,10 @@ mod prim_u128 { }
|
||||
//
|
||||
/// 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).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
@ -722,6 +726,10 @@ mod prim_isize { }
|
||||
//
|
||||
/// 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).*
|
||||
///
|
||||
/// However, please note that examples are shared between primitive integer
|
||||
|
Loading…
Reference in New Issue
Block a user