MemoryLayout
The memory layout of a type, describing its size, stride, and alignment.
@frozen enum MemoryLayout<T> where T : ~Copyable
You can use MemoryLayout
as a source of information about a type when allocating or binding memory using raw pointers. The following example declares a Point
type with x
and y
coordinates and a Boolean isFilled
property.
struct Point {
let x: Double
let y: Double
let isFilled: Bool
}
The size, stride, and alignment of the Point
type are accessible as static properties of MemoryLayout<Point>
.
// MemoryLayout<Point>.size == 17
// MemoryLayout<Point>.stride == 24
// MemoryLayout<Point>.alignment == 8
Always use a multiple of a type’s stride
instead of its size
when allocating memory or accounting for the distance between instances in memory. This example allocates uninitialized raw memory with space for four instances of Point
.
let count = 4
let pointPointer = UnsafeMutableRawPointer.allocate(
byteCount: count * MemoryLayout<Point>.stride,
alignment: MemoryLayout<Point>.alignment)