为什么 posix_memalign 函数需要 sizeof(void *) 进行对齐?

为什么 posix_memalign 函数需要 sizeof(void *) 进行对齐?

posix_memalign()手册页中,写alignment参数应该是power of two and a multiple of sizeof(void *).

类似的程序只memalign()需要alignment参数为a power of two

为什么posix_memalign()要求alignment参数是 sizeof(void *) 的倍数,但memalign()事实并非如此?

我浏览了 的源代码(具体是glibc实现)posix_memalign(),它内部调用了该memalign()函数。这两个函数之间有什么区别(除了一个posix一致而另一个不一致)以及为什么alignment变量要求之间存在差异?

任何技术解释都值得赞赏。谢谢。

答案1

这种差异是由于历史原因造成的。

memalign()SunOS 中引入了您所描述的宽松对齐要求,并且这些已被保留在 GNU C 库中(但不是在索拉里斯)。

posix_memalign()是 POSIX 的一部分,并且具有更严格的对齐要求,特别是为了确保返回的指针可用于直接块设备 I/O,并可用于释放分配的内存free()。某些实现memalign()不满足这些要求。看Linux 手册页中的注释。由于 POSIX 指定了具有广泛应用(包括平台覆盖范围)的功能,因此基本要求需要足够强大,以免在大多数需要 POSIX 合规性的平台上造成实施困难。

sizeof(void *)是平台的指针大小,这在历史上一直是各种情况(包括上面提到的两种情况)下的常见最小对齐要求。

相关内容