在分析源码时会碰到一些代码,不纠结它并不会影响我理解源码,但是细看一下会发现它的确有一些精巧,但是当了解了它的含义之后,又发觉它很简单,不过我还是把它当作一个小知识,一点点积攒在这里。
因此,这篇文章会不断的随着我阅读源码而更新的
1. 位运算向上舍入
Objects/object.c
的_PyObject_NewVar
函数中,它首先要用_PyObject_VAR_SIZE
计算该对象所用内存,这里有另外一个宏_Py_SIZE_ROUND_UP(n, a)
,作用是求出n最接近的a的倍数(前提条件:n是2的幂)
#define _Py_SIZE_ROUND_UP(n, a) (((size_t)(n) + \
(size_t)((a) - 1)) & ~(size_t)((a) - 1))
这里有点太复杂,简化一下就是下面的代码,简化的代码直接使用可能会出问题,但它比较简洁,在理解含义时看一下是不错的
#define _Py_SIZE_ROUND_UP(n, a) (n + (a-1) & ~(a-1))
举个例子,a为4(2的2次幂),则a-1的二进制是11,我们举一些例子,就可以看出它的效果了:(表格中前为二进制,后为十进制)
n | n + (a-1) | (n + (a-1) & ~(a-1)) |
---|---|---|
100/4 | 111/7 | 100/4 |
101/5 | 1000/8 | 1000/8 |
110/6 | 1001/9 | 1000/8 |
111/7 | 1010/10 | 1000/8 |
代码重点就在通过& ~(a-1))将后两位二进制变为0,而如果不给n加(a-1),那结果就是向下舍入
网友评论