int定义源码 python_【图片】Python 源码:int【西安网星软件吧】_百度贴吧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

具体的构造方法 PyInt_FromLong

这个方法的定义

PyObject *

PyInt_FromLong(long ival)

{

register PyIntObject *v;

/* MARK: 如果, 值在小整数范围内, 直接从小整数对象池获取得到对象 */

#if NSMALLNEGINTS + NSMALLPOSINTS > 0

if (-NSMALLNEGINTS ival & ival NSMALLPOSINTS) {

/* MARK: small_ints是什么后面说 */

v = small_ints[ival + NSMALLNEGINTS];

// 引用+1

Py_INCREF(v);

/* 这里先忽略, 计数 */

#ifdef COUNT_ALLOCS

if (ival >= 0)

quick_int_allocs++;

else

quick_neg_int_allocs++;

#endif

// 返回

return (PyObject *) v;

}

#endif

// 如果free_list还不存在, 或者满了

if (free_list == NULL) {

// 新建一块PyIntBlock, 并将空闲空间链表头部地址给free_list

if ((free_list = fill_free_list()) == NULL)

// 如果失败, 返回

return NULL;

}

// 从free_list分出一个位置存放新的整数

/* Inline PyObject_New */

// 使用单向链表头位置

v = free_list;

// free_list指向单向链表下一个位置

free_list = (PyIntObject *)Py_TYPE(v);

// 初始化对象, 类型为PyInt_type, 值为ival

PyObject_INIT(v, &PyInt_Type);

v->ob_ival = ival;

// 返回

return (PyObject *) v;

}

注意这里的Py_TYPE()方法, 在我们第一篇文章里面有提到, 不知道的回去复习下对象的数据结构

#define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)

简而言之:

1. 先判断数值是否是小整数, 是的话从小整数对象池里面直接返回

(这个池固定大小, 下一点讲)

2. 如果不是, 从通用整数对象池里面取一个, 初始化返回

(如果这时候通用整数对象池还不存在或者已经满了, 新建一个池加入维护. 通用整数对象池后面讲)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值