PyListObject对象
Python中的list支持对元素的插入、添加和删除的操作。它是可变对象而且是一个变长对象。
看下PyListObject的定义:
typedef struct{
PyObject_VAR_HEAD
PyObject * ob_item ;
int allcoated ;
} PyListObject ;
ob_item指向PyListObject所维护的元素列表所在内存块的首地址。
PyListObject所采用的内存管理机制与c++中的vector所采用的内存管理机制相同,幷不是存多少东西就申请对应大小的空间,
而是一次申请一大块内存空间,allocated存储这一大块内存空间可容纳的元素个数。ob_size存储这一大块内存空间中已存储的元素个数。
Python提供PyList_New来生成一个PyListObject对象,它有一个参数size,指定该对象所维护的元素列表的初始元素个数。
PyObject * PyList_New( int size )
{
PyListObject * op;
size_t nbytes ;
//内存数量计算
nbytes = size*sizeof(PyObject*) ;
//检查内存是否溢出,这种检查方式到是很特别
if( nbytes/sizeof(PyObject*) != size )
return PyErr_NoMemory() ;
if( num_free_lists)
{
//缓冲区可用
num_free_lists -- ;
op = free_lists[num_free_lists] ;
_Py_NewReference( (PyObject*)op) ;
}
else
{
//缓冲区不可用
op = PyObject_GC_New(PyListObjects , &PyList_Type) ;
//据说该函数除了申请内存外,还为Python中的自动垃圾收集机制做一些工作
}
if( size<=0 )
op->item = NULL ;
else
{
op->item = ( PyObject *)PyMem_MALLOC(nbytes) ;
memset( op->item , 0 , nbytes) ;
}
op->ob_size = size ;
op->allocated = size ;
return (PyObject *)op ;
}
memset(op->item , 0 , sizeof(
/* python为list对象也提供了缓冲池,定义如下:
# define MAXFREELISTS 80
static PyListObject * free_lists[MAXFREELISTS] ;
static int num_free_lists = 0 ;
那个free_lists是在何处初始化的呢,它用将要删除的PyListObject对象初始化,当要删除一个PyListObject对象时,幷不删除
PyListObject对象,而只是删除PyListObject对象所维护的元素列表及其指向的对象。
看下系统清理一个对象的源码:
static void list_dealloc(PyListObject *op)
{
int i ;
if( op->item != NULL )
{
i = op->ob_size ;
while( --i>0 )
{
Py_XDECREF(op->ob_item[i]) ;
}
PyMem_FREE(op->ob_item) ;
}
if( num_free_lists < MAXFREELISTS && PyList_CheckExact(op) )
free_lists[num_free_lists++] = op ;
else
op->type->tp_free((PyObject*)op) ;
}
*/