从Python整数变量内存大小占用28字节谈起

  • 实验结果

本机环境64位Python 3.12

  • 内存布局图

0          4          8         12         16         20         24         28

 |----------|----------|----------|----------|----------|----------|----------|

 | ob_refcnt | ob_type    | ob_digit            |             pad               |

 |----------|----------|----------|----------|----------|----------|----------|

在这个布局图中,各个部分的含义如下:

  1. 1) ob_refcnt:4 字节,用于存储对象的引用计数。
  2. 2) ob_type:4 字节,指向对象的类型信息。
  3. 3) ob_digit :8字节,存储整数值。
  4. 4) pad: 12字节,用于填充和对齐,保证整个结构体大小为 28 字节。

在这个布局中,整数值被存储在 ob_digit 中,而引用计数和类型信息分别存储在 ob_refcnt  ob_type 中。填充字节用于对齐和填充,保证整个结构体的大小为 28 字节。这种布局使得整数对象在 Python 3.7 版本之后能够更加高效地存储整数值,并且减少了内存占用

  • 数据结构

Python 中,整数类型的结构体在 CPython 中被定义为 _PyLongObject,其中存储了整数对象的相关信息。以下是整数类型结构体 _PyLongObject 的简化版本:

typedef struct {

    PyObject_VAR_HEAD

    // other fields specific to long integers

    digit ob_digit[1];

} PyLongObject;

在这个结构体中,PyObject_VAR_HEAD 包含了对象的引用计数和类型信息,ob_digit 是一个数组,用于存储整数值。实际上,ob_digit 是一个灵活数组,其大小可以根据需要进行调整,以便存储长整型数据。

Python 3.7 版本之后,整数对象的内存布局调整,PyLongObject 结构体中的 ob_digit 数组用于存储整数值,而不再需要额外的字段来存储整数值。这样的设计使得整数对象的内存占用更加高效,同时也提高了整数对象的操作效率。

  • 再往下一层

PyObject_VAR_HEAD 是 Python 中用于定义可变大小对象的结构体宏。在 CPython 中,所有可变大小的对象(如列表、元组、字符串等)都以相同的结构开始,其中包含对象的引用计数和类型信息。

Python 3.7 中,PyObject_VAR_HEAD 的定义如下:

#define PyObject_VAR_HEAD                   \

    PyObject_HEAD                          \

Py_ssize_t ob_size;  /* Number of items in variable part */

其中:

  • PyObject_HEAD 包含了对象的引用计数和类型信息,通常定义为

#define PyObject_HEAD    \

    _PyObject_HEAD_EXTRA \

    Py_ssize_t ob_refcnt; \

struct _typeobject *ob_type;

  • ob_size 表示可变部分中的项目数量,例如,对于列表对象,ob_size 表示列表中元素的个数。

因此,PyObject_VAR_HEAD 宏实际上是将 PyObject_HEAD 中的引用计数和类型信息与 ob_size 合并在一起,用于定义可变大小对象的结构体。这样的设计使得 Python 能够灵活地处理可变大小对象,同时保持了一致的对象表示方式。

PyObject  Python 中所有对象的基本结构体,定义了所有 Python 对象共享的通用属性。在 CPython 中,PyObject 结构体的定义如下:

typedef struct _object {

    _PyObject_HEAD_EXTRA

    Py_ssize_t ob_refcnt;

    struct _typeobject *ob_type;

} PyObject;

其中:

  • _PyObject_HEAD_EXTRA 包含了一些额外的信息,通常用于调试和特定配置的目的。
  • ob_refcnt 表示对象的引用计数,用于跟踪对象的引用情况,当引用计数为 0 时,对象会被销毁。
  • ob_type 指向对象的类型对象,用于标识对象的类型信息,如整数、字符串、列表等。

PyObject 结构体是所有 Python 对象的基础,所有的 Python 对象都是以 PyObject 结构体为基础进行扩展的。通过这种方式,Python 实现了对象的通用性和灵活性,使得不同类型的对象可以共享相同的基本属性和行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/688517.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二手交易系统基于Uniapp+FastAdmin+ThinkPHP(源码搭建/上线/运营/售后/更新)

​一款基于UniappFastAdminThinkPHP开发的二手交易系统,卖家可以发布二手信息,买家可以在线询价,支持在线聊天(高级授权),在线购买支付,支持发布高价回收(高级授权)信息。自带社交板块,用户可以发布帖子、加…

微信小程序开发【Coffee Shopping】(1)

1.环境准备 微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 前端常用网站集合:http://www.wwp666.cn/ 微信小程序开发文档:https://developers.weixin.qq.com/miniprogram/dev/framework/quicksta…

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 软件工程里没有银弹&#xff…

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件

EMAIL-PHP功能齐全的发送邮件类可以发送HTML和附件 <?php class Email { //---设置全局变量 var $mailTo ""; // 收件人 var $mailCC ""; // 抄送 var $mailBCC ""; // 秘密抄送 var $mailFrom ""; // 发件人 var $mailSubje…

大模型时代,程序员如何卷?

最近在看电影《碟中谍7》&#xff0c;该片讲述了特工伊森亨特尝试与一个被称为智体的全能人工智能作战&#xff0c;其可以即时访问任何在线网络&#xff0c;他和他的团队成员试图找回控制人工智能智体所必需的两部分钥匙并将其摧毁的故事。 在剧中&#xff0c;智体是一个虚拟反…

商务分析方法与工具(八):Python的趣味快捷-年少不知numpy好,再见才觉很简单

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

本地部署泛微OA E9 Resin启动后无法显示验证码或二维码

本地部署泛微OA E9 Resin启动后无法显示验证码或二维码 报错内容截图&#xff1a; 原因&#xff1a;Resin的配置文件jvm设置不同步。 修改位置&#xff1a;两处。 resin/conf/resin.propertiesresin/conf/resin.xml 文件名称&#xff1a;resin.properties jvm_args(去掉PermSi…

springboot引入security,测试接口报Unauthorized

1、报错截图 2、当前项目pom文件引入security <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-security</artifactId><version>2.2.2.RELEASE</version> </dependency> 3、解决…

【C/C++】设计模式——工厂模式:简单工厂、工厂方法、抽象工厂

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

geotrust企业通配符证书2990

随着时代的变化&#xff0c;人们获取信息的方式由报纸、书籍变为手机、电脑&#xff0c;因此很多企事业单位用户开始在互联网中创建网站来进行宣传&#xff0c;吸引客户。为了维护网站安全环境&#xff0c;保护客户数据&#xff0c;企事业单位也开始使用SSL数字证书&#xff0c…

PX4FMU和PX4IO最底层启动过程分析(下)

PX4FMU和PX4IO最底层启动过程分析&#xff08;下&#xff09; PX4FMU的系统启动函数为nash_main(int argc,char *argv[]) PX4IO的系统启动函数为nash_start(int argc,char *argv[]) PX4FMU启动函数nash_main(int argc,char *argv[]) 首先分析一下nash_main(int argc,char *a…

程序员的归宿。。

大家好&#xff0c;我是瑶琴呀。 相信每个进入职场的人都考虑过自己的职业生涯规划&#xff0c;在不同的年龄段可能面临不同挑战&#xff0c;这点对于 35 的人应该更为感同身受。 对于程序员来说&#xff0c;大部分人的职业道路主要是下面三种&#xff1a;第一条&#xff0c;…