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用于缓存大整数对象,但是现在整数对象的实现机制改了,去除了大整数对象的缓冲机制。