16 void *al_malloc(size_t alignment
, size_t size
)
18 assert((alignment
& (alignment
-1)) == 0);
19 alignment
= std::max(alignment
, alignof(std::max_align_t
));
21 #if defined(HAVE_STD_ALIGNED_ALLOC)
22 size
= (size
+(alignment
-1))&~(alignment
-1);
23 return std::aligned_alloc(alignment
, size
);
24 #elif defined(HAVE_POSIX_MEMALIGN)
26 if(posix_memalign(&ret
, alignment
, size
) == 0)
29 #elif defined(HAVE__ALIGNED_MALLOC)
30 return _aligned_malloc(size
, alignment
);
32 size_t total_size
{size
+ alignment
-1 + sizeof(void*)};
33 void *base
{std::malloc(total_size
)};
36 void *aligned_ptr
{static_cast<char*>(base
) + sizeof(void*)};
37 total_size
-= sizeof(void*);
39 std::align(alignment
, size
, aligned_ptr
, total_size
);
40 *(static_cast<void**>(aligned_ptr
)-1) = base
;
47 void *al_calloc(size_t alignment
, size_t size
)
49 void *ret
{al_malloc(alignment
, size
)};
50 if(ret
) std::memset(ret
, 0, size
);
54 void al_free(void *ptr
) noexcept
56 #if defined(HAVE_STD_ALIGNED_ALLOC) || defined(HAVE_POSIX_MEMALIGN)
58 #elif defined(HAVE__ALIGNED_MALLOC)
62 std::free(*(static_cast<void**>(ptr
) - 1));