了解Python中大整数的内存分配

了解Python中大整数的内存分配,第1张

了解Python中大整数的内存分配

为什么

28
字节的初始值低至
1

我相信@bgusach完全回答了这一点;Python使用

C
结构来表示Python世界中的对象,包括
int
s的任何对象:

struct _longobject {    PyObject_VAR_HEAD    digit ob_digit[1];};

PyObject_VAR_HEAD
是一个宏,在展开时会在结构中添加另一个字段(该字段
PyVarObject
专门用于具有某种长度概念的对象),并且
ob_digits
是一个保存数字值的数组。锅炉板大小来自于结构,为小型
大型Python号码。

为什么增加

4
字节?

因为,当创建更大的数字时,大小(以字节为单位)是

sizeof(digit)
;的倍数。您可以看到,在
_PyLong_New
其中使用以下命令
longobject
执行新的内存分配
PyObject_MALLOC

if (size > (Py_ssize_t)MAX_LONG_DIGITS) {    PyErr_SetString(PyExc_OverflowError,         "too many digits in integer");    return NULL;}result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +   size*sizeof(digit));

offsetof(PyLongObject, ob_digit)
是与保持其值无关的长对象的“模板”(以字节为单位)。

digit
在头文件保持被定义
struct _longobject
typedef
uint32

typedef uint32_t digit;

并且

sizeof(uint32_t)
4
字节。这是当
size
参数to
_PyLong_New
增大时您将看到的大小(以字节为单位)增加的数量。


当然,这就是

C
Python选择实现它的方式。这是一个实现细节,因此您不会在PEP中找到太多信息。如果您可以找到相应的线程:-),则python-
dev邮件列表将包含实现讨论。

无论哪种方式,您都可能在其他流行的实现中发现不同的行为,因此请不要认为这是理所当然的。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4900205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-12
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存