标签:style class blog code http tar
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
1. PyIntObject --> long的一个简单包装
typedef struct{ PyObject_HEAD long ob_ival; } PyIntObject;
PyTypeObject PyInt_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, “int”, //… }
int_dealloc //删除 PyIntObject 对象 int_free //删除 PyIntObject 对象 int_repr //转化成 PyString 对象 int_hash //获得 HASH 值 int_print //打印 PyIntObject 对象 int_compare //比较操作 int_as_number //数值操作 int_methods //成员函数PyIntObject是定长对象,不可变对象 --> 因为不可变,所以对象池里的每一个PyIntObject对象都能够被任意地共享,不用担心被修改。
PyObject *PyInt_FromLong(long ival) PyObject *PyInt_FromString(char *s, char **pend, int base) #ifdef Py_USING_UNICODE PyObject *PyInt_FromUnicode(Py_Unicode *s, int length, int base) #endifPyInt_FromString和PyInt_FromUnicode利用了设计模式中的Adaptor Pattern思想对整数对象的核心创建函数PyInt_FromLong进行了接口转换
#ifndf NSMALLPOSINTS #define NSMALLPOSINTS 257 #endif #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif #if NSMALLNEGINTS + NSMALLPOSINTS > 0 static PyIntObject *small_ints[NSMALLPOSINTS + NSMALLPOSINTS]; #endif3.1 通用整数对象池(大整数对象池)
#define BLOCK_SIZE 1000 /* 1K less typical malloc overhead */ #define BHEAD_SIZE 8 /* Enough for a 64-bit pointer */ #define N_INTOBJECTS ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject)) struct _intblock { struct _intblock *next; PyIntObject objects[N_INTOBJECTS]; }; typedef struct _intblock PyIntBlock; static PyIntBlock *block_list = NULL;//维护PyIntBlock的单向列表 static PyIntObject *free_list = NULL;//管理全部block的objects中的所有空闲内存PyInt_FromLong函数
《python源码剖析》笔记 python中的整数对象,布布扣,bubuko.com
标签:style class blog code http tar
原文地址:http://blog.csdn.net/zhengsenlie/article/details/30510397