![为什么 posix_memalign 函数需要 sizeof(void *) 进行对齐?](https://linux22.com/image/204736/%E4%B8%BA%E4%BB%80%E4%B9%88%20posix_memalign%20%E5%87%BD%E6%95%B0%E9%9C%80%E8%A6%81%20sizeof(void%20*)%20%E8%BF%9B%E8%A1%8C%E5%AF%B9%E9%BD%90%EF%BC%9F.png)
在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 *)
是平台的指针大小,这在历史上一直是各种情况(包括上面提到的两种情况)下的常见最小对齐要求。