1.Python的list对象
先来看看PyListObject的定义
typedef struct{
PyObject_VAR_HEAD;
PyObject **ob_item
int allocated
} PyListObject;
ob_item这个指针和紧接着的allocated数值正是维护元素列表也就是PyString *列表的关键。指针指向了元素列表所在的内存块地址的首地址,而allocated中则维护了当前列表可容纳的元素总数。那PyObject_VAR_HEAD的ob_size和allocated又有什么关系呢?其实他们都与PyListObject对象的内存管理有关,他并不是存了多少东西就申请相应大小的内存,在每次申请内存的时候,PyListObject总会申请一大块内存,这时申请的总内存的大小记录在allocated中,而其中实际使用了的内存数量则记录在了ob_size中。
2.PyListObject对象创建与维护
PyObject* PyList_New(int size):
首先,Python在[1]处会计算所需的内存总量,因为PyList_New指定的仅仅是元素的个数,而不是元素所占的内存空间。
接下来就是Python对列表对象的创建动作。Python中的列表对象实际是分为两部分的,一是PyListObject对象本身,二则是PyListObject对象维护的元素列表。这是两块分离的内存,它们通过ob_item建立联系。
在创建PyListObject对象时,会首先检查缓冲池free_lists中是否有