天津和平做网站公司,wordpress能否解析万网的域名,深圳燃气公司是国企吗,如何加强省市网站建设python3 整数类型PyLongObject 和PyObject源码分析一 测试环境介绍和准备测试环境#xff1a;操作系统#xff1a;windows10Python版本#xff1a;3.7.0 下载地址VS版本#xff1a;vs2015社区版(免费) 下载地址win10SDK(安装vs2015是可以选择#xff0c;如果没有安装则需要…python3 整数类型PyLongObject 和PyObject源码分析一 测试环境介绍和准备测试环境操作系统windows10Python版本3.7.0 下载地址VS版本vs2015社区版(免费) 下载地址win10SDK(安装vs2015是可以选择如果没有安装则需要独立安装)http://ffmpeg.club/python二 如何查看源码1 下载python源码https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xzhttp://www.ffmpeg.club/python下载后解压缩使用vs2015或者vs2017打开Python-3.7.0\PCbuild\pcbuild.sln 解决方案文件打开pythoncore项目可以找到\include\object.h文件三 源码分析python源码版本 python3.7.0在python中所有的类型都可以转为PyObject类型单python用的是c语言并没有继承机制我们可以通过源码看它试如何实现的我们先看PyObject源码1 PyObject 源码typedef struct _object {_PyObject_HEAD_EXTRAPy_ssize_t ob_refcnt;struct _typeobject *ob_type;} PyObject;1-1 _PyObject_HEAD_EXTRA 源码我们先看第一个成员是一个宏 _PyObject_HEAD_EXTRA这个宏是如下定义#ifdef Py_TRACE_REFS/Define pointers to support a doubly-linked list of all live heap objects./#define _PyObject_HEAD_EXTRA \struct _object _ob_next; \struct _object_ob_prev;#define _PyObject_EXTRA_INIT 0, 0,#else#define _PyObject_HEAD_EXTRA#define _PyObject_EXTRA_INIT#endif通过代码我们可以看出它根据环境给_PyObject_HEAD_EXTRA设置的值有可能是空的或者是一个双向链表。通过编译代码我们知道他在debug版本的python中是用的双向链表而在release版本中是空。1-2 Py_ssize_t ob_refcnt 引用计数Py_ssize_t 类型在32位程序中就是int在64位win程序中是__int64引用计数的策略后面我们专门写文章分析1-3 struct _typeobject ob_type;源码比较长就不全部列出来这个结构体中包含了一个PyObject对象的所有相关操作函数和属性比如对象创建和销毁函数print对象的序列化函数等存储方式都是通过函数指针。所以每种python类型都会对各类操作函数指针做赋值设定。其中的PyObject_VAR_HEAD宏内容如下typedef struct {PyObject ob_base;Py_ssize_t ob_size; / Number of items in variable part */} PyVarObject;2 PyLongObject 整数对象digitstruct _longobject {PyObject_VAR_HEADdigit ob_digit[1];};2-1 小数预处理对于比较小的数(-5到257 )直接返回初始化好的值所以说大量的小整数时不会新增额外的空间do if (-NSMALLNEGINTS ival ival NSMALLPOSINTS) { \return get_small_int((sdigit)ival); \} while(0)2-2 按照数字的发小分配空间以unsigned short为单位数字少于16位也就是2个字节的用一个digit (unsigned short) 存放数字少于32位也就是4个字节的用两个个digit (unsigned short) 存放2-3 大数处理如果是超大数就用多个字节存放由于变量就是一个 unsigned long先看一下源码对于不同的系统大数能表示的范围不一致因为数字采用的是unsigned long存放在不同的系统大小不一致可以见如下表其中 windows 64位使用的是 LLP64所以 在window中python数字的最大值也就是4个字节如果用它来存放64位指针的地址就会丢失数据。在linux(ubuntu16.04 64)使用的是LP64,所以数字最大值就是8个字节。相关视频可以观看http://edu.51cto.com/course/15278.html