Struct Layout
struct Layout { ... }
Layout of a block of memory.
An instance of Layout describes a particular layout of memory.
You build a Layout up as an input to give to an allocator.
All layouts have an associated size and a power-of-two alignment. The size, when rounded up to
the nearest multiple of align, does not overflow isize (i.e., the rounded value will always be
less than or equal to isize::MAX).
(Note that layouts are not required to have non-zero size,
even though GlobalAlloc requires that all memory requests
be non-zero in size. A caller must either ensure that conditions
like this are met, use specific allocators with looser
requirements, or use the more lenient Allocator interface.)
Implementations
impl Layout
const fn from_size_align(size: usize, align: usize) -> Result<Self, LayoutError>Constructs a
Layoutfrom a givensizeandalign, or returnsLayoutErrorif any of the following conditions are not met:-
alignmust not be zero, -
alignmust be a power of two, -
size, when rounded up to the nearest multiple ofalign, must not overflowisize(i.e., the rounded value must be less than or equal toisize::MAX).
-
const fn from_size_alignment(size: usize, alignment: Alignment) -> Result<Self, LayoutError>Constructs a
Layoutfrom a givensizeandalignment, or returnsLayoutErrorif any of the following conditions are not met:size, when rounded up to the nearest multiple ofalignment, must not overflowisize(i.e., the rounded value must be less than or equal toisize::MAX).
unsafe const fn from_size_align_unchecked(size: usize, align: usize) -> SelfCreates a layout, bypassing all checks.
Safety
This function is unsafe as it does not verify the preconditions from
Layout::from_size_align.unsafe const fn from_size_alignment_unchecked(size: usize, alignment: Alignment) -> SelfCreates a layout, bypassing all checks.
Safety
This function is unsafe as it does not verify the preconditions from
Layout::from_size_alignment.const fn size(self: &Self) -> usizeThe minimum size in bytes for a memory block of this layout.
const fn align(self: &Self) -> usizeThe minimum byte alignment for a memory block of this layout.
The returned alignment is guaranteed to be a power of two.
const fn alignment(self: &Self) -> AlignmentThe minimum byte alignment for a memory block of this layout.
The returned alignment is guaranteed to be a power of two.
const fn new<T>() -> SelfConstructs a
Layoutsuitable for holding a value of typeT.const fn for_value<T: ?Sized>(t: &T) -> SelfProduces layout describing a record that could be used to allocate backing structure for
T(which could be a trait or other unsized type like a slice).unsafe const fn for_value_raw<T: ?Sized>(t: *const T) -> SelfProduces layout describing a record that could be used to allocate backing structure for
T(which could be a trait or other unsized type like a slice).Safety
This function is only safe to call if the following conditions hold:
- If
TisSized, this function is always safe to call. - If the unsized tail of
Tis:- a [slice], then the length of the slice tail must be an initialized
integer, and the size of the entire value
(dynamic tail length + statically sized prefix) must fit in
isize. For the special case where the dynamic tail length is 0, this function is safe to call. - a trait object, then the vtable part of the pointer must point
to a valid vtable for the type
Tacquired by an unsizing coercion, and the size of the entire value (dynamic tail length + statically sized prefix) must fit inisize. - an (unstable) extern type, then this function is always safe to
call, but may panic or otherwise return the wrong value, as the
extern type's layout is not known. This is the same behavior as
Layout::for_valueon a reference to an extern type tail. - otherwise, it is conservatively not allowed to call this function.
- a [slice], then the length of the slice tail must be an initialized
integer, and the size of the entire value
(dynamic tail length + statically sized prefix) must fit in
- If
const fn dangling_ptr(self: &Self) -> NonNull<u8>Creates a
NonNullthat is dangling, but well-aligned for this Layout.Note that the address of the returned pointer may potentially be that of a valid pointer, which means this must not be used as a "not yet initialized" sentinel value. Types that lazily allocate must track initialization by some other means.
const fn align_to(self: &Self, align: usize) -> Result<Self, LayoutError>Creates a layout describing the record that can hold a value of the same layout as
self, but that also is aligned to alignmentalign(measured in bytes).If
selfalready meets the prescribed alignment, then returnsself.Note that this method does not add any padding to the overall size, regardless of whether the returned layout has a different alignment. In other words, if
Khas size 16,K.align_to(32)will still have size 16.Returns an error if the combination of
self.size()and the givenalignviolates the conditions listed inLayout::from_size_align.const fn adjust_alignment_to(self: &Self, alignment: Alignment) -> Result<Self, LayoutError>Creates a layout describing the record that can hold a value of the same layout as
self, but that also is aligned to alignmentalignment.If
selfalready meets the prescribed alignment, then returnsself.Note that this method does not add any padding to the overall size, regardless of whether the returned layout has a different alignment. In other words, if
Khas size 16,K.align_to(32)will still have size 16.Returns an error if the combination of
self.size()and the givenalignmentviolates the conditions listed inLayout::from_size_alignment.const fn padding_needed_for(self: &Self, alignment: Alignment) -> usizeReturns the amount of padding we must insert after
selfto ensure that the following address will satisfyalignment.e.g., if
self.size()is 9, thenself.padding_needed_for(alignment4)(wherealignment4.as_usize() == 4) returns 3, because that is the minimum number of bytes of padding required to get a 4-aligned address (assuming that the corresponding memory block starts at a 4-aligned address).Note that the utility of the returned value requires
alignmentto be less than or equal to the alignment of the starting address for the whole allocated block of memory. One way to satisfy this constraint is to ensurealignment.as_usize() <= self.align().const fn pad_to_align(self: &Self) -> LayoutCreates a layout by rounding the size of this layout up to a multiple of the layout's alignment.
This is equivalent to adding the result of
padding_needed_forto the layout's current size.const fn repeat(self: &Self, n: usize) -> Result<(Self, usize), LayoutError>Creates a layout describing the record for
ninstances ofself, with a suitable amount of padding between each to ensure that each instance is given its requested size and alignment. On success, returns(k, offs)wherekis the layout of the array andoffsis the distance between the start of each element in the array.Does not include padding after the trailing element.
(That distance between elements is sometimes known as "stride".)
On arithmetic overflow, returns
LayoutError.Examples
use Layout; // All rust types have a size that's a multiple of their alignment. let normal = from_size_align.unwrap; let repeated = normal.repeat.unwrap; assert_eq!; // But you can manually make layouts which don't meet that rule. let padding_needed = from_size_align.unwrap; let repeated = padding_needed.repeat.unwrap; assert_eq!; // Repeating an element zero times has zero size, but keeps the alignment (like `[T; 0]`) let repeated = normal.repeat.unwrap; assert_eq!; let repeated = padding_needed.repeat.unwrap; assert_eq!;const fn extend(self: &Self, next: Self) -> Result<(Self, usize), LayoutError>Creates a layout describing the record for
selffollowed bynext, including any necessary padding to ensure thatnextwill be properly aligned, but no trailing padding.In order to match C representation layout
repr(C), you should callpad_to_alignafter extending the layout with all fields. (There is no way to match the default Rust representation layoutrepr(Rust), as it is unspecified.)Note that the alignment of the resulting layout will be the maximum of those of
selfandnext, in order to ensure alignment of both parts.Returns
Ok((k, offset)), wherekis layout of the concatenated record andoffsetis the relative location, in bytes, of the start of thenextembedded within the concatenated record (assuming that the record itself starts at offset 0).On arithmetic overflow, returns
LayoutError.Examples
To calculate the layout of a
#[repr(C)]structure and the offsets of the fields from its fields' layouts:# use ; # // test that it works # # let s = ; # let u16 = ; # let u32 = ; # let u64 = ; # assert_eq!;const fn repeat_packed(self: &Self, n: usize) -> Result<Self, LayoutError>Creates a layout describing the record for
ninstances ofself, with no padding between each instance.Note that, unlike
repeat,repeat_packeddoes not guarantee that the repeated instances ofselfwill be properly aligned, even if a given instance ofselfis properly aligned. In other words, if the layout returned byrepeat_packedis used to allocate an array, it is not guaranteed that all elements in the array will be properly aligned.On arithmetic overflow, returns
LayoutError.const fn extend_packed(self: &Self, next: Self) -> Result<Self, LayoutError>Creates a layout describing the record for
selffollowed bynextwith no additional padding between the two. Since no padding is inserted, the alignment ofnextis irrelevant, and is not incorporated at all into the resulting layout.On arithmetic overflow, returns
LayoutError.const fn array<T>(n: usize) -> Result<Self, LayoutError>Creates a layout describing the record for a
[T; n].On arithmetic overflow or when the total size would exceed
isize::MAX, returnsLayoutError.
impl Clone for Layout
fn clone(self: &Self) -> Layout
impl Copy for Layout
impl Debug for Layout
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Eq for Layout
impl Freeze for Layout
impl Hash for Layout
fn hash<__H: $crate::hash::Hasher>(self: &Self, state: &mut __H)
impl PartialEq for Layout
fn eq(self: &Self, other: &Layout) -> bool
impl RefUnwindSafe for Layout
impl Send for Layout
impl StructuralPartialEq for Layout
impl Sync for Layout
impl Unpin for Layout
impl UnsafeUnpin for Layout
impl UnwindSafe for Layout
impl<T> Any for Layout
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Layout
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Layout
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for Layout
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for Layout
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for Layout
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Layout
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Layout
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>