在其中一个采访样本中遇到了这个问题。如何仅使用标准库分配对齐的内存中已经回答了 16 字节对齐的分配?
但是,我有一个关于用于将最后 4 位归零的掩码的具体问题。此掩码“~0F”已被使用,使得结果地址可被 16 整除。应该做些什么来实现 32 字节对齐/可除性相同?
在其中一个采访样本中遇到了这个问题。如何仅使用标准库分配对齐的内存中已经回答了 16 字节对齐的分配?
但是,我有一个关于用于将最后 4 位归零的掩码的具体问题。此掩码“~0F”已被使用,使得结果地址可被 16 整除。应该做些什么来实现 32 字节对齐/可除性相同?
首先,您提到的问题是 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 合并的位保持不变,并且所有与 0 合并的位都设置为 0。因此,您最终会得到 ptr 的原始值,除了最后 5 位已设置为 0。这意味着我们减去了 0 到 31 之间的某个数字,以使 ptr 成为 32 的倍数,这就是目标。