在PG源码中,MAXALIGN这个宏,返回最接近输入数字(大于)且能整除8的数,仅此而已。
常用于内存相关的计算,在PG代码中使用的相当广泛,为啥要用这个MAXALIGN?我估计是基于 “CPU访问对齐的地址性能更高” 的认识,PG中各种对象:tuple、page等大小和起始地址都是8字节对齐的,为了8字节对齐,还常常要padding。
有时内存地址的对齐,需要大于MAXALIGN,这时可以用 BUFFERALIGN,它返回最接近输入数字(大于)且能整除32的数。
在新的PG版本中,MemoryContext 提供了可以返回 指定对齐地址 的内存分配函数:
void *MemoryContextAllocAligned(MemoryContext context, Size size, Size alignto, int flags)
它的实现原理也颇为简单,简单地说,就是分配略大于 size + alignto 的一块内存,这样,无论MemoryContextAllocExtended(不支持内存对齐返回)返回的地址是否按照 alignto 对齐,在这块内存中,总能找到按alignto对齐的地址,而且这个对齐地址其后面,可用内存一定大于需要的内存(size)。
有兴趣可以看一下这个函数的代码,对代码粗糙的解释就是下面这张图,当然它还计入了MemoryChunk。