Dee*_*dar 0 c memory-management
在一个采访样本中遇到了这个问题.在如何仅使用标准库分配对齐的内存中已经回答了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的倍数,这就是目标.