malloc不允许任意对齐。我们可以做到这一点,但我们最终得到了一个不同的指针位置。免费需要原件。
有没有办法通知malloc新的指针,以便它可以调整自己,我们不必存储旧的指针/偏移量?
答案 0 :(得分:2)
C11引入了aligned_alloc
,它支持指定对齐方式。它的实现定义了支持哪些对齐,但是在POSIX上它应该像posix_memalign(3)
,它支持两个sizeof(void*)
倍数的幂。
还要考虑,如果常规malloc
就足够了。所有分配的malloc
都对齐_Alignof(max_align_t)
。
如果C11不可用,则有posix_memalign(3)
。如果您使用的是Windows,则从MSVC 2015开始_aligned_alloc
或使用VirtualAlloc
并分配页面对齐的缓冲区。
如果这些都不起作用,则必须在malloc
之上推出自己的解决方案。获取下一个对齐的地址,保存前两个字节的对齐。在调用自由包装器时,获取前面的2个字节,从指针中减去它们并释放结果。
答案 1 :(得分:1)
好吧,我相信 C11 就有这样的野兽
Defined in header <stdlib.h>
void *aligned_alloc( size_t alignment, size_t size );