1.\" Copyright (C) 2006 Jason Evans <jasone@FreeBSD.org>. 2.\" All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice(s), this list of conditions and the following disclaimer as 9.\" the first lines of this file unmodified other than the possible 10.\" addition of one or more copyright notices. 11.\" 2. Redistributions in binary form must reproduce the above copyright 12.\" notice(s), this list of conditions and the following disclaimer in 13.\" the documentation and/or other materials provided with the 14.\" distribution. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 17.\" EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE 20.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23.\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25.\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27.\" 28.Dd April 7, 2019 29.Dt POSIX_MEMALIGN 3 30.Os 31.Sh NAME 32.Nm posix_memalign , 33.Nm aligned_alloc 34.Nd aligned memory allocation 35.Sh LIBRARY 36.Lb libc 37.Sh SYNOPSIS 38.In stdlib.h 39.Ft int 40.Fn posix_memalign "void **ptr" "size_t alignment" "size_t size" 41.Ft void * 42.Fn aligned_alloc "size_t alignment" "size_t size" 43.Sh DESCRIPTION 44The 45.Fn posix_memalign 46function allocates 47.Fa size 48bytes of memory such that the allocation's base address is an even multiple of 49.Fa alignment , 50and returns the allocation in the value pointed to by 51.Fa ptr . 52.Pp 53The requested 54.Fa alignment 55must be a power of 2 at least as large as 56.Fn sizeof "void *" . 57.Pp 58Memory that is allocated via 59.Fn posix_memalign 60can be used as an argument in subsequent calls to 61.Xr realloc 3 , 62.Xr reallocf 3 , 63and 64.Xr free 3 . 65.Pp 66The 67.Fn aligned_alloc 68is similar to 69.Fn posix_memalign , 70but it does not have the 71.Fn sizeof "void *" 72restriction, takes just 73.Fa alignment 74and 75.Fa size 76and the allocation pointer is returned. 77.Sh IMPLEMENTATION NOTES 78The 79.Fn posix_memalign 80function is directly supported by matching the requested alignment against a zone 81of the slab allocator with a compatible chunking, and using the power-of-2 82shortcut whenever possible. 83Alignments beyond those supported by the zone mechanism are still 84guaranteed using cute 85.Xr mmap 2 86tricks. 87Our 88.Fn posix_memalign 89is thus able to take advantage of the slab allocator to produce 90well-fitted results when the requests are reasonable. 91.Sh RETURN VALUES 92The 93.Fn posix_memalign 94function returns the value 0 if successful; otherwise it returns an error value. 95The 96.Fn aligned_alloc 97returns a pointer to the allocated memory if successful; otherwise a 98.Dv NULL 99pointer is returned and 100.Va errno 101is set. 102.Sh ERRORS 103The 104.Fn posix_memalign 105and 106.Fn aligned_alloc 107functions will fail if: 108.Bl -tag -width Er 109.It Bq Er EINVAL 110The 111.Fa alignment 112parameter is not a power of 2 at least as large as 113.Fn sizeof "void *" . 114.It Bq Er ENOMEM 115Memory allocation error. 116.El 117.Sh SEE ALSO 118.Xr free 3 , 119.Xr malloc 3 , 120.Xr realloc 3 , 121.Xr reallocf 3 , 122.Xr valloc 3 123.Sh STANDARDS 124The 125.Fn posix_memalign 126function conforms to 127.St -p1003.1-2008 . 128The 129.Fn aligned_alloc 130function conforms to 131.St -isoC-2011 . 132