[python源码剖析]整数对象(二)
前面,我们说的是小整数对象池被激活后,发生的一系列变化。下面来谈谈,当通用对象池被激活,对象又是如何存储的。
使用通用对象池
在PyInt_FromLong中,在必要的空间被申请之后,python会从当前由free_list所维护的自由内存链表中划分一块,并在这块内存上创建所需的新的PyintObject对象,同时完成一些初始化工作。还要将free_list指针指向下一个空闲的内存块空间。
我们知道,两个PyintBlock处于同一个链表中,但是其中的Object对象却是分离存储,在存储过程中就可能出现这样一种情况:
假设有两个PyintBlock对象,如上图所示PyintBlock1和PyintBlock2,其中PyintBlock1被Object对象填满,而PyintBlock2中只填了少部分,现在的free_list指向Pyintobject2的空闲块。假设PyintBlock1.object中的一个PyIntobject对象被删除了。这就意味着PyintBlock1出现了空闲块,而PyintBlock2能不能感知到PyintBlock1存在空闲块呢?我们知道,不同的PyintBlock对象的object中的空闲块是被链接在一起的,形成了单向链表,表头指针正是free_list.那么,这个链接过程是发生在什么时候?其实,这一切都发生在一个PyIntObject对象被销毁的时候。至于是如何链接的,这里就不再说明。
小整数对象池的初始化
int _PyInt_Init(void){ PyIntObject *v; int ival; #if NSMALLNEGINTS + NSMALLPOSINTS > 0 for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) { if (!free_list && (free_list = fill_free_list()) == NULL) return 0; /* PyObject_New is inlined */ v = free_list; free_list = (PyIntObject *)Py_TYPE(v); PyObject_INIT(v, &PyInt_Type); v->ob_ival = ival; small_ints[ival + NSMALLNEGINTS] = v; } #endif return 1; }
从上述代码,我们可以看出,这些小整数对象也是在Block_list所维护的内存上。在python初始化的时候,_PyInt_Init被调用。内存被申请,小整数对象被创建。
至此,整数对象到这里就结束了。
[下一篇]字符串对象剖析:http://www.cnblogs.com/vipchenwei/articles/6943233.html