-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Docs for size_of::<#[repr(C)]> items. #44897
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -209,6 +209,35 @@ pub fn forget<T>(t: T) { | |
/// 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`. | ||
/// | ||
/// # Size of #[repr(C)] items | ||
/// | ||
/// The `C` representation for items has a defined layout. With this layout, | ||
/// the size of items is also stable as long as all fields have a stable size. | ||
/// | ||
/// ## Structs | ||
/// | ||
/// For `structs`, the size is determined by the following algorithm. | ||
/// | ||
/// For each field in the struct ordered by declaration order: | ||
/// | ||
/// 1. Add the size of the field. | ||
/// 2. Round up the current size to the nearest multiple of the next field's [alignment]. | ||
/// | ||
/// Finally, round the size of the struct to the nearest multiple of its [alignment]. | ||
/// | ||
/// Unlike `C`, zero sized structs are not rounded up to one byte in size. | ||
/// | ||
/// ## Enums | ||
/// | ||
/// Enums that carry no data other than the descriminant have the same size as C enums | ||
/// on the platform they are compiled for. | ||
/// | ||
/// ## Unions | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't know what's wrong with linkchecker, but it seems this title is not acceptable.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Havvy Ok the problem is that Could we workaround by saying "Size of Structs"/"Size of Enums"/"Size of Unions"? |
||
/// | ||
/// The size of a union is the size of its largest field. | ||
/// | ||
/// Unlike `C`, zero sized unions are not rounded up to one byte in size. | ||
/// | ||
/// # Examples | ||
/// | ||
/// ``` | ||
|
@@ -231,6 +260,55 @@ pub fn forget<T>(t: T) { | |
/// assert_eq!(mem::size_of::<&i32>(), mem::size_of::<Option<&i32>>()); | ||
/// assert_eq!(mem::size_of::<Box<i32>>(), mem::size_of::<Option<Box<i32>>>()); | ||
/// ``` | ||
/// | ||
/// Using `#[repr(C)]`. | ||
/// | ||
/// ``` | ||
/// use std::mem; | ||
/// | ||
/// #[repr(C)] | ||
/// struct FieldStruct { | ||
/// first: u8, | ||
/// second: u16, | ||
/// third: u8 | ||
/// } | ||
/// | ||
/// // The size of the first field is 1, so add 1 to the size. Size is 1. | ||
/// // The alignment of the second field is 2, so add 1 to the size for padding. Size is 2. | ||
/// // The size of the second field is 2, so add 2 to the size. Size is 4. | ||
/// // The alignment of the third field is 1, so add 0 to the size for padding. Size is 4. | ||
/// // The size of the third field is 1, so add 1 to the size. Size is 5. | ||
/// // Finally, the alignment of the struct is 2, so add 1 to the size for padding. Size is 6. | ||
/// assert_eq!(6, mem::size_of::<FieldStruct>()); | ||
/// | ||
/// #[repr(C)] | ||
/// struct TupleStruct(u8, u16, u8); | ||
/// | ||
/// // Tuple structs follow the same rules. | ||
/// assert_eq!(6, mem::size_of::<TupleStruct>()); | ||
/// | ||
/// // Note that reordering the fields can lower the size. We can remove both padding bytes | ||
/// // by putting `third` before `second`. | ||
/// #[repr(C)] | ||
/// struct FieldStructOptimized { | ||
/// first: u8, | ||
/// third: u8, | ||
/// second: u16 | ||
/// } | ||
/// | ||
/// assert_eq!(4, mem::size_of::<FieldStructOptimized>()); | ||
/// | ||
/// // Union size is the size of the largest field. | ||
/// #[repr(C)] | ||
/// union ExampleUnion { | ||
/// smaller: u8, | ||
/// larger: u16 | ||
/// } | ||
/// | ||
/// assert_eq!(2, mem::size_of::<ExampleUnion>()); | ||
/// ``` | ||
/// | ||
/// [alignment]: ./fn.align_of.html | ||
#[inline] | ||
#[stable(feature = "rust1", since = "1.0.0")] | ||
#[cfg_attr(not(stage0), rustc_const_unstable(feature = "const_size_of"))] | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Put
#[repr(C)]
inside backticks`…`
.