这个大小排列是如何工作的(How is this size alignment working)

2019-08-08 13:46发布

我无法理解下面的代码相对于所提供的评论。 这是什么代码做,什么将是等效的码8-aligned

/* segment size must be 4-aligned */
attr->options.ssize &= ~3;

在这里, ssizeunsigned int类型。

Answer 1:

由于图4中的二进制是100,任何值对准到4字节边界(即4的倍数)将具有设置为零的最后两个比特。

3二进制是11,和〜3是那些位的按位求反,即,... 1111100。 执行位,并用该值将保持每一点相同的,除了最后两个将被清除(位和1位==,和位&0 == 0)。 这为我们提供了下一个较低的或相等值,该值是4的倍数。

要为8(二进制1000)做同样的操作,我们需要清除最低的三个位。 我们可以做到这一点与二进制111的按位取反,即约7。



Answer 2:

两(1,2,4,8,16,32 ...)中的所有功率可以通过简单和操作来对准。

这给四舍五入大小:

size &= ~(alignment - 1); 

或者,如果你想圆了:

size = (size + alignment-1) & ~(alignment-1);

“对齐-1”,只要它是二的幂的值,就会给你“所有的人”达位仅差两个电源。 ~反转所有位,所以你得到药粥零和零供的。

您可以检查的东西是二经的动力:

bool power_of_two = !(alignment & (alignment-1))

这样做是因为,例如4:

4    = 00000100
4-1  = 00000011
&      --------
0    = 00000000

或16:

16   = 00010000
16-1 = 00001111
&      --------
0    = 00000000

如果我们用5来代替:

5    = 00000101
4-1  = 00000100
&      --------
4    = 00000100

所以不是2的力量!



Answer 3:

也许更容易理解的评论将

/* make segment size 4-aligned
   by zeroing two least significant bits, 
   effectively rounding down */

然后,至少对我来说,迫切的问题啪啪我的脑海:如果真的被舍去,当它的大小? 会不会围捕更合适:

attr->options.ssize = (attr->options.ssize + 3) & ~3;

在其他的答案已经说过,使其8对齐,3位需要被清零,所以用7 ,而不是3 。 所以,我们可以使之成为一个功能:

unsigned size_align(unsigned size, unsigned bit_count_to_zero) 
{
  unsigned bits = (1 << bit_count_to_zero) - 1;
  return (size + bits) & ~bits;
}


Answer 4:

~3是位模式...111100 。 当你这样做的位与该模式,它清除底部的两个位,即向下取整为4最接近的倍数。

~7确实为8对齐同样的事情。



Answer 5:

代码确保底部两个比特ssize被清除,低保ssize是4等效代码的倍数为8对齐。将

attr->options.ssize &= ~7;


Answer 6:

number = number & ~3

被四舍五入4最接近的倍数较少 number例:

      if number is 0,1,2 or 3, the `number` is rounded off to 0

类似地if number is 4,5,6,or 7,数字is rounded off to 4

但如果这是涉及到内存对齐 ,该内存必须向上和向下不对齐。



文章来源: How is this size alignment working