Check Notes
from max_align_t:
Pointers returned by allocation functions such as malloc are suitably aligned for any object, which means they are aligned at least as strictly as max_align_t.
It means the memory allocated dynamically is guaranteed to alignof(max_align_t)
bytes aligned.
Check Notes
from aligned_alloc:
Passing a size which is not an integral multiple of alignment or a alignment which is not valid or not supported by the implementation causes the function to fail and return a null pointer (C11, as published, specified undefined behavior in this case, this was corrected by DR 460).
It means the alignment for aligned_alloc
is implementation dependent.
Write a simple program to test aligned_alloc
behavior in macOS
and Linux (X86_64)
:
$ cat align.c
#include <stdalign.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("alignof(max_align_t)=%zu\n\n", alignof(max_align_t));
size_t size = 1024;
size_t align[] = {1, 2, 4, 8, 16, 32, 64};
for (size_t i = 0; i < sizeof(align) / sizeof(align[0]); i++)
{
void *p = aligned_alloc(align[i], size);
printf("align=%zu, pointer is %p\n", align[i], p);
free(p);
}
}
Build and run it in macOS
:
$ cc align.c -o align
$ ./align
alignof(max_align_t)=16
align=1, pointer is 0x0
align=2, pointer is 0x0
align=4, pointer is 0x0
align=8, pointer is 0x7fbd48801600
align=16, pointer is 0x7fbd48801600
align=32, pointer is 0x7fbd48801600
align=64, pointer is 0x7fbd48801600
In Linux (X86_64)
:
$ cc align.c -o align
$ ./align
alignof(max_align_t)=16
align=1, pointer is 0x5645aec676b0
align=2, pointer is 0x5645aec676b0
align=4, pointer is 0x5645aec676b0
align=8, pointer is 0x5645aec676b0
align=16, pointer is 0x5645aec676b0
align=32, pointer is 0x5645aec67ac0
align=64, pointer is 0x5645aec67f40
Both macOS
and Linux (X86_64)
have the same alignment of allocating memory from free storage: 16
bytes. macOS
requires the alignment of aligned_alloc
is at least 8
bytes; whilst Linux (X86_64)
doesn’t have this requirement.
P.S., the code can be downloaded here.