1.整数对象
在Python3.11.2
中,整数结构体叫做PyLongObject
。
|
|
通过PyObject_VAR_HEAD
我们可以确定,在新版Python
中,整形是一个不定长对象。
通过前面的文章,我们知道,对于Python
中的对象,与对象相关的元信息实际上都保存在与对象对应的类型对象中,对于PyLongObject
,这个类型对象是PyLong_Type
。
|
|
PyLongObject
对象的各种操作(比较、运算等)实际上就是调用PyLong_Type
中的tp_as_number
这个结构体中定义的各种函数指针。
|
|
在3.11.2
中,我们可以看到long_add函数
不需要进行溢出检查。
|
|
2.创建
|
|
我们通过PyLong_FromLong
来了解Python
是怎么创建一个PyLongObject
对象的。
|
|
3.销毁
前面我们说过,当一个对象不再被引用时,会将引用计数器减1
,如果引用计数器等于0
,那么就会销毁(如果对象有缓存机制,就会缓存)对象。
针对PyLongObject
对象,当最后一次引用PyLongObject
的对象销毁时,会触发PyLongObject
的销毁。
|
|
在_Py_Dealloc
函数中,会调用对象的tp_dealloc
函数用于销毁对应对象的内存(*dealloc)(op)
。
4.缓存机制
Python
为避免频繁在堆上申请和释放小整数对象的内存,使用了对象池,用于缓存小整数对象。
默认小整数池的大小为5+257
个,区间为[-5, 257)
,可以通过修改宏定义来修改小整数池的数量。
|
|
当Python
解释器启动时,会自动初始化小整数池。
|
|
以前的Python
版本还有free_list
用于缓存大整数对象,但是现在整数对象的实现机制改了,去除了大整数对象的缓冲机制。