[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

posted @ 2017-06-02 16:25  看雪。  阅读(183)  评论(0编辑  收藏  举报