64字节对齐,先贴代码:
#define IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a)-1)))
#define align_buffer_64(var, size) \
uint8* var##_mem = (uint8*)(malloc((size) + 63)); /* NOLINT */ \
uint8* var = (uint8*)(((intptr_t)(var##_mem) + 63) & ~63) /* NOLINT */
#define free_aligned_buffer_64(var) \
free(var##_mem); \
var = 0
以上代码,来自libyuv开源库。
分析之,
1.预先分配size+63个字节的内存;
2.从内存的首地址开始,首先偏移63字节,再取掩码(& ~63)
为什么是多分配一部分内存,再偏移。而不先计算好内存长度,再分配内存呢?