16

我无法理解这个宏的作用。这些是定义的,linux-kernel但我的怀疑与此无关。我无法理解(((x)+(mask))&~(mask))line 的作用。

#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))

任何帮助表示赞赏。

4

2 回答 2

30

假设你有一个号码:0x1006

由于某些原因,您希望将其与4字节边界对齐。

使用 4 字节边界,您知道对齐的值是0x10000x10040x1008等。然后您还知道对齐的值0x10060x1008

你会怎么得到0x1008?对齐值的对齐掩码4(4 - 1) = 0x03

现在0x1006 + 0x03 = 0x10090x1009 & ~0x03 = 0x1008

这个操作就是 __ALIGN_MASK宏。

如果你想传递值4(对齐)而不是直接0x03(对齐掩码),你有ALIGN

于 2012-10-29T14:18:38.230 回答
11
#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)

对齐方式 ,a被强制转换为x's 类型,然后减去一个。对齐应该是 2 的幂,因此会产生一些' 类型的位模式00..011..11,即掩码(如果 1s )。xka = 2^k

然后

#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))

将掩码的值添加到x,因此(x)+ (mask)至少与不小于x和小于下一个较大倍数的对齐的最小倍数一样大。然后按位和掩码的补码将该数字减少到对齐的倍数。

对于形式2^k - 1的掩码,计算

(x + mask) & ~mask

是相同的

(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))

或者

((x + 2^k - 1)/(2^k)) * (2^k)
于 2012-10-29T13:53:54.337 回答