如何在C中分配32字节对齐的内存

时间:2012-07-30 03:08:53

标签: c memory-management

在一个采访样本中遇到了这个问题。在How to allocate aligned memory only using the standard library?

中已经回答了16字节对齐的分配

但是,我有一个特定的问题,关于用于将最后4位归零的掩码。已使用此掩码“~0F”,使得结果地址可被16整除。对于32字节对齐/可分性,应采取哪些措施来实现相同的目标?

1 个答案:

答案 0 :(得分:5)

首先,您提到的问题是16字节对齐,而不是16位对齐。

关于你的实际问题,你只想掩盖5位而不是4位以使结果32字节对齐。所以它会是~0x1F

澄清一下:

要将指针对齐到32字节边界,您希望地址的最后5位为0.(因为100000是32的二进制,32的任何倍数将以00000结尾。)

0x1F是二进制的11111。因为它是一个指针,它实际上是一些0的后跟11111 - 例如,对于64位指针,它将是59 0和5 1。 〜表示这些值是反转的 - 所以~0x1F是59 1,然后是5 0。

当您使用ptr & ~0x1F时,按位&导致所有用1和1的位保持不变,所有用0和0的位都设置为0.所以最终得到ptr的原始值,除了最后5位已经设置为0.这意味着我们减去0到31之间的某个数字,以使ptr成为32的倍数,这就是目标。